Tutorial: Entwerfen einer relationalen Datenbank in Azure SQL-Datenbank mit C# und ADO.NET
Gilt für:: Azure SQL-Datenbank
Azure SQL-Datenbank ist eine relationale DBaaS-Lösung (Database-as-a-Service) in Microsoft Cloud (Azure). In diesem Tutorial erfahren Sie, wie Sie das Azure-Portal und ADO.NET mit Visual Studio für folgende Aufgaben verwenden:
- Erstellen einer Datenbank über das Azure-Portal
- Einrichten einer IP-Firewallregel auf Serverebene mit dem Azure-Portal
- Herstellen einer Verbindung für die Datenbank mit ADO.NET und Visual Studio
- Erstellen von Tabellen mit ADO.NET
- Einfügen, Aktualisieren und Löschen von Daten mit ADO.NET
- Abfragen von Daten mit ADO.NET
Tipp
In diesem kostenlosen Learn-Modul erfahren Sie, wie Sie eine ASP.NET-Anwendung entwickeln und konfigurieren, die eine Azure SQL-Datenbank abfragt. Sie erfahren u. a., wie Sie eine einfache Datenbank erstellen.
Voraussetzungen
- Eine Installation von Visual Studio 2019 oder höher
- Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
- Wenn Sie noch keine Azure SQL-Datenbank erstellt haben, rufen Sie die Schnellstartanleitung zum Erstellen einer einzelnen Datenbank auf. Suchen Sie nach der Option, ihr Angebot zu verwenden, um Azure SQL-Datenbank (Vorschau) kostenlos zu testen.
Melden Sie sich auf dem Azure-Portal an.
Melden Sie sich beim Azure-Portal an.
Erstellen einer IP-Firewallregel auf Serverebene
Azure SQL-Datenbank erstellt eine IP-Firewall auf Serverebene. Diese Firewall verhindert, dass externe Anwendungen und Tools eine Verbindung mit dem Server und Datenbanken auf dem Server herstellen, sofern die IP-Adresse nicht durch eine Firewallregel zugelassen wird. Um externe Verbindungen mit Ihrer Datenbank zuzulassen, müssen Sie zunächst eine IP-Firewallregel für Ihre IP-Adresse (oder einen IP-Adressbereich) hinzufügen. Führen Sie die folgenden Schritte aus, um eine IP-Firewallregel auf Serverebene zu erstellen.
Wichtig
SQL-Datenbank kommuniziert über Port 1433. Wenn Sie versuchen, mit diesem Dienst eine Verbindung aus einem Unternehmensnetzwerk heraus herzustellen, wird der ausgehende Datenverkehr über Port 1433 von der Firewall Ihres Netzwerks unter Umständen nicht zugelassen. In diesem Fall können Sie nur dann eine Verbindung mit der Datenbank herstellen, wenn Ihr Administrator Port 1433 öffnet.
Wählen Sie nach Abschluss der Bereitstellung im Menü auf der linken Seite SQL-Datenbanken und dann auf der Seite SQL-Datenbanken die Option für yourDatabase aus. Die Übersichtsseite für Ihre Datenbank wird geöffnet, die den vollqualifizierten Servernamen (z.B. yourserver.database.windows.net) und Optionen für die weitere Konfiguration enthält.
Kopieren Sie diesen vollqualifizierten Servernamen, um in SQL Server Management Studio eine Verbindung mit Ihrem Server und den Datenbanken herzustellen.
Navigieren Sie im Azure-Portal zum logischen SQL Server für Ihre Azure SQL-Datenbank-Instanz. Die einfachste Möglichkeit besteht darin, den Wert Servernamen auf der Seite SQL-Datenbank auszuwählen.
Klicken Sie im Ressourcenmenü unter Einstellungen auf Netztechnologie.
Wählen Sie die Registerkarte Öffentlicher Zugriff und dann unter Öffentlicher Netzwerkzugriff die Option Ausgewählte Netzwerke aus.
Scrollen Sie nach unten zum Abschnitt Firewall-Regeln.
Wählen Sie auf der Symbolleiste Fügen Sie Ihre Client-IPv4-Adresse hinzu aus, um Ihre aktuelle IP-Adresse einer neuen IP-Firewallregel hinzuzufügen. Eine IP-Firewallregel kann Port 1433 für eine einzelne IP-Adresse oder einen Bereich von IP-Adressen öffnen.
Wählen Sie Speichern aus. Für Ihre aktuelle IP-Adresse wird eine IP-Firewallregel auf Serverebene erstellt, und auf dem Server wird der Port 1433 geöffnet.
Wählen Sie OK aus, und schließen Sie anschließend die Seite Firewalleinstellungen.
Die IP-Adresse kann nun die IP-Firewall passieren. Nun können Sie mit SQL Server Management Studio oder einem anderen Tool Ihrer Wahl die Verbindung mit der Datenbank herstellen. Verwenden Sie das Serveradministratorkonto, das Sie zuvor erstellt haben.
Wichtig
Standardmäßig ist der Zugriff über die SQL-Datenbank-IP-Firewall für alle Azure-Dienste aktiviert. Wählen Sie auf dieser Seite AUS aus, um den Zugriff für alle Azure-Dienste zu deaktivieren.
Beispiel für C#-Programm
In den nächsten Abschnitten dieses Artikels wird ein C#-Programm vorgestellt, das ADO.NET zum Senden von Transact-SQL-Anweisungen (T-SQL) an SQL-Datenbank verwendet. Mit dem C#-Programm werden die folgenden Aktionen gezeigt:
- Herstellen einer Verbindung mit SQL-Datenbank über ADO.NET
- Methoden, die T-SQL-Anweisungen zurückgeben
- Erstellen von Tabellen
- Auffüllen von Tabellen mit Daten
- Aktualisieren, Löschen und Auswählen von Daten
- Übermitteln von T-SQL-Anweisungen an die Datenbank
Entitätsbeziehungsdiagramm
Die CREATE TABLE
-Anweisungen enthalten das Schlüsselwort REFERENCES, um eine Fremdschlüssel-Beziehung (Foreign Key, FK) zwischen zwei Tabellen zu erstellen. Bei Verwendung von tempdb kommentieren Sie das Schlüsselwort --REFERENCES
heraus, indem Sie zwei vorangestellte Bindestriche verwenden.
Das Entitätsbeziehungsdiagramm zeigt die Beziehung zwischen den beiden Tabellen. Die Werte in der untergeordneten Spalte tabEmployee.DepartmentCode sind auf die Werte beschränkt, die in der übergeordneten Spalte tabDepartment.Department angegeben sind.
Hinweis
Sie können die T-SQL-Anweisungen bearbeiten, um den Tabellennamen ein #
-Zeichen voranzustellen, damit sie in tempdb als temporäre Tabellen erstellt werden. Dies kann zu Demonstrationszwecken nützlich sein, wenn keine Testdatenbank verfügbar ist. Alle Verweise auf Fremdschlüssel werden bei ihrer Verwendung nicht erzwungen, und temporäre Tabellen werden automatisch gelöscht, wenn die Verbindung nach dem Abschluss der Programmausführung beendet wird.
Kompilieren und Ausführen
Das C#-Programm ist logisch eine CS-Datei und physisch in mehrere Codeblöcke unterteilt, damit jeder Block leichter zu verstehen ist. Gehen Sie wie folgt vor, um das Programm zu kompilieren und auszuführen:
Erstellen Sie in Visual Studio ein C#-Projekt. Der Projekttyp sollte eine Konsole sein, die sich unter Vorlagen>Visual C#>Windows Desktop>Konsolen-App (.NET Framework) befindet.
Ersetzen Sie in der Datei Program.cs die Startzeilen des Codes, indem Sie die folgenden Schritte ausführen:
Kopieren Sie die folgenden Codeblöcke (in derselben Reihenfolge, in der sie angezeigt werden), und fügen Sie sie ein. Siehe hierzu Verbinden mit SQL-Datenbank, Generieren von T-SQL-Anweisungen und Übermitteln an die Datenbank.
Ändern Sie in der
Main
-Methode die folgenden Werte:- cb.DataSource
- cb.UserID
- cb.Password
- cb.InitialCatalog
Stellen Sie sicher, dass auf die Assembly System.Data.dll verwiesen wird. Erweitern Sie für die Sicherstellung den Knoten Verweise im Projektmappen-Explorer-Bereich.
Wählen Sie die Schaltfläche Start aus, um das Programm zu erstellen und in Visual Studio auszuführen. Die Berichtsausgabe wird in einem Programmfenster angezeigt, auch wenn die GUID-Werte zwischen den Testläufen variieren.
================================= T-SQL to 2 - Create-Tables... -1 = rows affected. ================================= T-SQL to 3 - Inserts... 8 = rows affected. ================================= T-SQL to 4 - Update-Join... 2 = rows affected. ================================= T-SQL to 5 - Delete-Join... 2 = rows affected. ================================= Now, SelectEmployees (6)... 8ddeb8f5-9584-4afe-b7ef-d6bdca02bd35 , Alison , 20 , acct , Accounting 9ce11981-e674-42f7-928b-6cc004079b03 , Barbara , 17 , hres , Human Resources 315f5230-ec94-4edd-9b1c-dd45fbb61ee7 , Carol , 22 , acct , Accounting fcf4840a-8be3-43f7-a319-52304bf0f48d , Elle , 15 , NULL , NULL View the report output here, then press any key to end the program...
Herstellen einer Verbindung mit SQL-Datenbank über ADO.NET
using System;
using System.Data.SqlClient; // System.Data.dll
//using System.Data; // For: SqlDbType , ParameterDirection
namespace csharp_db_test
{
class Program
{
static void Main(string[] args)
{
try
{
var cb = new SqlConnectionStringBuilder();
cb.DataSource = "your_server.database.windows.net";
cb.UserID = "your_user";
cb.Password = "your_password";
cb.InitialCatalog = "your_database";
using (var connection = new SqlConnection(cb.ConnectionString))
{
connection.Open();
Submit_Tsql_NonQuery(connection, "2 - Create-Tables", Build_2_Tsql_CreateTables());
Submit_Tsql_NonQuery(connection, "3 - Inserts", Build_3_Tsql_Inserts());
Submit_Tsql_NonQuery(connection, "4 - Update-Join", Build_4_Tsql_UpdateJoin(),
"@csharpParmDepartmentName", "Accounting");
Submit_Tsql_NonQuery(connection, "5 - Delete-Join", Build_5_Tsql_DeleteJoin(),
"@csharpParmDepartmentName", "Legal");
Submit_6_Tsql_SelectEmployees(connection);
}
}
catch (SqlException e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("View the report output here, then press any key to end the program...");
Console.ReadKey();
}
Methoden, die T-SQL-Anweisungen zurückgeben
static string Build_2_Tsql_CreateTables()
{
return @"
DROP TABLE IF EXISTS tabEmployee;
DROP TABLE IF EXISTS tabDepartment; -- Drop parent table last.
CREATE TABLE tabDepartment
(
DepartmentCode nchar(4) not null PRIMARY KEY,
DepartmentName nvarchar(128) not null
);
CREATE TABLE tabEmployee
(
EmployeeGuid uniqueIdentifier not null default NewId() PRIMARY KEY,
EmployeeName nvarchar(128) not null,
EmployeeLevel int not null,
DepartmentCode nchar(4) null
REFERENCES tabDepartment (DepartmentCode) -- (REFERENCES would be disallowed on temporary tables.)
);
";
}
static string Build_3_Tsql_Inserts()
{
return @"
-- The company has these departments.
INSERT INTO tabDepartment (DepartmentCode, DepartmentName)
VALUES
('acct', 'Accounting'),
('hres', 'Human Resources'),
('legl', 'Legal');
-- The company has these employees, each in one department.
INSERT INTO tabEmployee (EmployeeName, EmployeeLevel, DepartmentCode)
VALUES
('Alison' , 19, 'acct'),
('Barbara' , 17, 'hres'),
('Carol' , 21, 'acct'),
('Deborah' , 24, 'legl'),
('Elle' , 15, null);
";
}
static string Build_4_Tsql_UpdateJoin()
{
return @"
DECLARE @DName1 nvarchar(128) = @csharpParmDepartmentName; --'Accounting';
-- Promote everyone in one department (see @parm...).
UPDATE empl
SET
empl.EmployeeLevel += 1
FROM
tabEmployee as empl
INNER JOIN
tabDepartment as dept ON dept.DepartmentCode = empl.DepartmentCode
WHERE
dept.DepartmentName = @DName1;
";
}
static string Build_5_Tsql_DeleteJoin()
{
return @"
DECLARE @DName2 nvarchar(128);
SET @DName2 = @csharpParmDepartmentName; --'Legal';
-- Right size the Legal department.
DELETE empl
FROM
tabEmployee as empl
INNER JOIN
tabDepartment as dept ON dept.DepartmentCode = empl.DepartmentCode
WHERE
dept.DepartmentName = @DName2
-- Disband the Legal department.
DELETE tabDepartment
WHERE DepartmentName = @DName2;
";
}
static string Build_6_Tsql_SelectEmployees()
{
return @"
-- Look at all the final Employees.
SELECT
empl.EmployeeGuid,
empl.EmployeeName,
empl.EmployeeLevel,
empl.DepartmentCode,
dept.DepartmentName
FROM
tabEmployee as empl
LEFT OUTER JOIN
tabDepartment as dept ON dept.DepartmentCode = empl.DepartmentCode
ORDER BY
EmployeeName;
";
}
Übermitteln von T-SQL-Anweisungen an die Datenbank
static void Submit_6_Tsql_SelectEmployees(SqlConnection connection)
{
Console.WriteLine();
Console.WriteLine("=================================");
Console.WriteLine("Now, SelectEmployees (6)...");
string tsql = Build_6_Tsql_SelectEmployees();
using (var command = new SqlCommand(tsql, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("{0} , {1} , {2} , {3} , {4}",
reader.GetGuid(0),
reader.GetString(1),
reader.GetInt32(2),
(reader.IsDBNull(3)) ? "NULL" : reader.GetString(3),
(reader.IsDBNull(4)) ? "NULL" : reader.GetString(4));
}
}
}
}
static void Submit_Tsql_NonQuery(
SqlConnection connection,
string tsqlPurpose,
string tsqlSourceCode,
string parameterName = null,
string parameterValue = null
)
{
Console.WriteLine();
Console.WriteLine("=================================");
Console.WriteLine("T-SQL to {0}...", tsqlPurpose);
using (var command = new SqlCommand(tsqlSourceCode, connection))
{
if (parameterName != null)
{
command.Parameters.AddWithValue( // Or, use SqlParameter class.
parameterName,
parameterValue);
}
int rowsAffected = command.ExecuteNonQuery();
Console.WriteLine(rowsAffected + " = rows affected.");
}
}
} // EndOfClass
}
Tipp
Um mehr über das Schreiben von SQL-Abfragen zu erfahren, rufen Sie das Tutorial zum Schreiben von T-SQL-Anweisungen auf.
Zugehöriger Inhalt
- Azure SQL-Datenbank kostenlos testen (Vorschau)
- Neuigkeiten in Azure SQL-Datenbank
- Inhaltsreferenz: Konfigurieren und Verwalten – Azure SQL-Datenbank
- Planen und Verwalten der Kosten für Azure SQL-Datenbank
Nächster Schritt
Im nächsten Tutorial erhalten Sie Informationen zur Datenmigration.