Compartir a través de


Acceso programático a SQL Azure

Conectarse desde una aplicación a SQL Azure puede llegar a realizarse sin tener que modificar una sólo línea de código, ya en muchas ocasiones el único cambio que será necesario realizará será el de cambiar la cadena de conexión.

<connectionStrings>
<add name="SQLAzureConnection" connectionString="Data Source="
<ProvideServerName>
.database.windows.net;Initial Catalog=TestDb;User
ID=<ProvideUserName> ;Password=<ProvidePassword>;Encrypt=true;
Trusted_Connection=false;" providerName="System.Data.SqlClient"/>
</connectionStrings>

Las aplicaciones clientes pueden conectarse a través de los siguientes protocolos:

  • ADO.NET, incluido Entity Framework.

  • Acceso ODBC nativo.

  • SQL Azure incluye soporte para PHP.

Conectarse a SQL Azure desde ASP.NET

Trabajando con SQL Azure se pueden realizar los bindings entre la base de datos de Azure y los controles de ASP.NET del mismo modo en que se trabaja con SQL Server.

Es importante tener en cuenta que en fase de desarrollo no es conveniente trabajar directamente contra una base de datos de SQL Azure, ya que aparte de la latencia de la red, habría que tener en cuenta el coste que supondría.

La clase SqlDataSource es perfectamente compatible con SQL Azure por lo que pueden convertirse aplicaciones con sólo cambiar la cadena de conexión.

<asp:SqlDataSource ID="SqlAzureDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:SQLAzureConnection %>"
InsertCommand="INSERT INTO [Table1] ([Col1], [Col2])
VALUES (@Col1, @Col2)" SelectCommand="SELECT * FROM
[Table1]" UpdateCommand="UPDATE [Table1] SET [Col2] =
@Col2 WHERE [Col1] = @Col1" DeleteCommand="DELETE FROM
[Table1] WHERE [Col1] = @Col1">
<UpdateParameters>
<asp:Parameter Name="Col2" Type="String"/>
<asp:Parameter Name="Col1" Type="Int32"/>
</UpdateParameters>
<InsertParameters>
<asp:formParameter Name="Col1"FormField="TextBox1" />
<asp:formParameter Name="Col2" FormField="TextBox2" />
</InsertParameters>
<DeleteParameters>
<asp:Parameter Name="Col1" Type="Int32" />
</DeleteParameters>
</asp:SqlDataSource>

Conectarse desde Entity Framework

Como ya se ha comentado anteriormente Entity Framework es completamente compatible con SQL Azure. Por lo tanto, la migración de una aplicación que emplee esta tecnología, a nivel de acceso a datos, podría ser tan simple como cambiar la cadena de conexión en el fichero de configuración:

<connectionStrings>
<add name="SchoolEntities" connectionString="metadata=res:
//*/SchoolDataModel.csdl| res://*/SchoolDataModel.ssdl|res:
//*/SchoolDataModel.msl;provider=System.Data.SqlClient;
provider connection string=&quot;Data Source="
<provideServerName> .database.windows.net;Initial
Catalog=School;Integrated Security=False;User ID=
<provideUserID> ;Password=<providePassword>
;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate
=False&quot;" providerName="System.Data.EntityClient"/>
</connectionStrings

Por lo tanto, tecnologías en las que Entity Framework suele ser un elemento fundamental, como WCF Data Services, WCF RIA Services o ASP.NET Dynamic Data será perfectamente compatibles en cuanto al acceso a datos se refiere.

Conectarse a SQL Azure desde PHP

SQL Azure permite que aplicaciones realizadas en PHP puedan conectarse empleando el driver de SQL Server para PHP. Un aplicación PHP se incluye en Windows Azure como un Web CGI Role.

Después de crear la aplicación con Web CGI Role es necesario configurar el handle para FastCGI. Dentro del fichero de configuraciónm dentro de la sección <handlers> de <system.webServer> habrá que añadir lo siguiente:

 <add name="PHP_FastCGI" verb="*" path="*.php"
scriptProcessor="%RoleRoot%\approot\php-cgi.exe"
modules="FastCgiModule" resourceType="Unspecified" />

En el fichero web.roleconfig también será necesario añadir la siguiente sección:

 <application fullPath="%RoleRoot%\approot\php-cgi.exe"/ 

Después, se podría añadir un nuevo fichero con extensión php y en sus propiedades establecer la propiedad Content a Copy Always.

Y dentro del fichero php se podría escribir un código como el siguiente, completamente compatible con SQL Azure.

<?php
$serverName = "tcp:ProvideServerName.database.windows.net,1433";
$userName = 'ProvideUserName@ProvideServerName';
$userPassword = 'ProvidePassword';
$dbName = "TestDB";
$table = "tablePHP";
$connectionInfo = array("Database"=>$dbName, "UID"=>
$userName,"PWD"=>$userPassword,"MultipleActiveResultSets"=>true);
sqlsrv_configure('WarningsReturnAsErrors', 0);
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if($conn === false)
{ FatalError("Failed to connect...");}
CreateTable($conn, $table, "Col1 int primary key,Col2 varchar(20)");
$tsql = "INSERT INTO [$table] (Col1, Col2) VALUES
(1, 'string1'), (2, 'string2')";
$stmt = sqlsrv_query($conn, $tsql);
if ($stmt === false)
{FatalError("Failed to insert data into test table:".$tsql); }
sqlsrv_free_stmt($stmt);
$tsql = "SELECT Col1, Col2 FROM [$table]";
$stmt = sqlsrv_query($conn, $tsql);
if ($stmt === false)
{ FatalError("Failed to query test table: ".$tsql); }
else
{ while($row = sqlsrv_fetch_array ($stmt, SQLSRV_FETCH_NUMERIC))
{ echo "Col1: ".$row[0] ."\n"; echo "Col2: ".$row[1]."\n"; }
sqlsrv_free_stmt($stmt); } sqlsrv_close($conn);
function CreateTable($conn, $tableName, $dataType)
{ $sql = "CREATE TABLE [$tableName] ($dataType)";
DropTable($conn,$tableName);
$stmt = sqlsrv_query($conn,$sql);
if ($stmt === false)
{ FatalError("Failed to create test table: ".$sql); }
sqlsrv_free_stmt($stmt);
}
function DropTable($conn, $tableName)
{ $stmt = sqlsrv_query($conn, "DROP TABLE [$tableName]");
if ($stmt === false)
{ }
else
{ sqlsrv_free_stmt($stmt); }
}
function FatalError($errorMsg){
Handle_Errors(); die($errorMsg."\n");
}
function Handle_Errors() {
$errors = sqlsrv_errors(SQLSRV_ERR_ERRORS);
$count = count($errors);
if($count == 0)
{ $errors = sqlsrv_errors(SQLSRV_ERR_ALL); $count = count($errors);}
if($count > 0)
{ for($i = 0; $i < $count; $i++)
{ echo $errors[$i]['message']."\n"; }
}
}
?>