使用C# 設計您的第一個關聯式資料庫- Azure SQL Database
文章推薦指數: 80 %
Azure SQL Database 是Microsoft Cloud (Azure) 中的關聯式資料庫即服務(DBaaS)。
在本教學課程裡,您將了解如何搭配使用Visual Studio 與Azure 入口 ...
跳到主要內容
已不再支援此瀏覽器。
請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。
下載MicrosoftEdge
其他資訊
目錄
結束焦點模式
儲存
編輯
共用
Twitter
LinkedIn
Facebook
電子郵件
WeChat
目錄
教學課程:使用C#和ADO.NET在AzureSQLDatabase中設計關聯式資料庫
08/26/2021
r
o
本文內容
適用於:
AzureSQLDatabase
AzureSQLDatabase是MicrosoftCloud(Azure)中的關聯式資料庫即服務(DBaaS)。
在本教學課程裡,您將了解如何搭配使用VisualStudio與Azure入口網站和ADO.NET執行下列操作:
使用Azure入口網站建立資料庫
使用Azure入口網站設定伺服器層級的IP防火牆規則
使用ADO.NET和VisualStudio連線到資料庫
使用ADO.NET建立資料表
使用ADO.NET插入、更新和刪除資料
使用ADO.NET查詢資料
*如果您沒有Azure訂用帳戶,請在開始前建立免費帳戶。
提示
下列MicrosoftLearn模組可協助您免費學習如何開發和設定可查詢AzureSQLDatabase的ASP.NET應用程式(包括建立簡易資料庫)。
必要條件
VisualStudio2019或更新版本的安裝。
在AzureSQLDatabase中建立空白的資料庫
使用一組定義的計算和儲存體資源建立AzureSQLDatabase的資料庫。
此資料庫建立於Azure資源群組內,並使用邏輯SQL伺服器進行管理。
遵循以下步驟來建立空白資料庫。
按一下Azure入口網站左上角的[建立資源]。
在[新增]頁面上,選取[AzureMarketplace]區段中的[資料庫],然後按一下[精選]區段中的[SQLDatabase]。
使用下列資訊填寫SQLDatabase表單,如上圖所示︰
設定
建議的值
描述
資料庫名稱
yourDatabase
如需有效的資料庫名稱,請參閱資料庫識別碼。
訂用帳戶
yourSubscription
如需訂用帳戶的詳細資訊,請參閱訂用帳戶。
資源群組
yourResourceGroup
如需有效的資源群組名稱,請參閱命名規則和限制。
選取來源
空白資料庫
指定應建立空白資料庫。
按一下[伺服器]來使用現有伺服器,或建立及設定新的伺服器。
選取現有的伺服器,或按一下[建立新伺服器]並且在[新伺服器]表單中填寫下列資訊︰
設定
建議的值
描述
伺服器名稱
任何全域唯一名稱
如需有效的伺服器名稱,請參閱命名規則和限制。
伺服器管理員登入
任何有效名稱
如需有效的登入名稱,請參閱資料庫識別碼。
密碼
任何有效密碼
您的密碼至少要有8個字元,而且必須使用下列幾種字元的其中三種︰大寫字元、小寫字元、數字和非英數字元。
位置
任何有效位置
如需區域的相關資訊,請參閱Azure區域。
按一下[選取]。
按一下[定價層]可指定服務層、DTU或虛擬核心的數目,以及儲存體數量。
您可以瀏覽DTU/虛擬核心數目的選項,以及可供您每個服務層級使用的儲存體。
在選取服務層、DTU或vCore數目和儲存體數量之後,按一下[套用]。
為空白資料庫輸入[定序](在此教學課程中使用預設值)。
如需定序的詳細資訊,請參閱定序。
您現在已完成SQLDatabase表單,請按一下[建立]來佈建資料庫。
這個步驟可能需要幾分鐘的時間。
在工具列上,按一下[通知]以監視部署程序。
建立伺服器層級IP防火牆規則
SQLDatabase會在伺服器層級建立IP防火牆。
此防火牆會防止外部應用程式和工具連線到伺服器及伺服器上的任何資料庫,除非防火牆規則允許其IP通過防火牆。
若要啟用對資料庫的外部連線,您必須先新增IP位址(或IP位址範圍)的IP防火牆規則新增。
依照下列步驟來建立伺服器層級的IP防火牆規則。
重要
SQLDatabase會透過連接埠1433通訊。
如果您嘗試從公司網路連線到這項服務,您網路的防火牆可能不允許透過連接埠1433的輸出流量。
若情況如此,除非系統管理員開啟連接埠1433,否則您無法連線至您的資料庫。
部署完成之後,按一下左側功能表中的[SQL資料庫],然後按一下[SQL資料庫]頁面上的[yourDatabase]。
資料庫的概觀頁面隨即開啟,其中會顯示完整伺服器名稱(例如yourserver.database.windows.net),並提供進一步的組態選項。
請複製此完整伺服器名稱,以便從SQLServerManagementStudio連線到伺服器和資料庫。
在工具列上按一下[設定伺服器防火牆]。
伺服器的[防火牆設定]頁面會隨即開啟。
按一下工具列上的[新增用戶端IP],將目前的IP位址新增至新的IP防火牆規則。
IP防火牆規則可以針對單一IP位址或IP位址範圍開啟連接埠1433。
按一下[檔案]。
系統便會為目前的IP位址建立伺服器層級IP防火牆規則,以便在伺服器上開啟連接埠1433。
依序按一下[確定],然後關閉[防火牆設定]頁面。
您的IP位址現在可以通過IP防火牆。
您現在可以使用SQLServerManagementStudio或您選擇的其他工具來連線至您的資料庫。
務必使用先前建立的伺服器管理帳戶。
重要
根據預設,已對所有Azure服務啟用透過SQLDatabaseIP防火牆存取。
按一下此頁面上的[關閉]即可對所有Azure服務停用存取權。
C#程式範例
本文的下一節會呈現使用ADO.NET將TRANSACT-SQL(T-SQL)陳述式傳送到SQLDatabase的C#程式。
C#程式會示範下列動作:
使用ADO.NET連線至SQLDatabase
可傳回T-SQL陳述式的方法
建立資料表
在資料表中填入資料
更新、刪除及選取資料
將T-SQL提交至資料庫
實體關聯圖(ERD)
CREATETABLE陳述式包含REFERENCES關鍵字,可建立兩個資料表之間的「外部索引鍵」(FK)關聯性。
如果您使用tempdb,請使用一對前置破折號將--REFERENCES關鍵字註解化。
ERD會顯示兩個資料表之間的關聯性。
tabEmployee.DepartmentCode「子」資料行中的值受限於tabDepartment.DepartmentCode「父」資料行中的值。
注意
您可以選擇編輯T-SQL,將前置#新增至資料表名稱,以將其建立為tempdb中的暫存資料表。
沒有測試資料庫可供使用時,這很適合用於示範。
在外部索引鍵使用期間不會強制執行任何參考,而在程式完成執行之後,暫存資料表會在連線關閉時自動刪除。
編譯和執行
C#程式在邏輯上是一個.cs檔案,而實際上會分成數個程式碼區塊,讓您更容易了解每個區塊。
若要編譯及執行此程式,請執行下列步驟:
在VisualStudio中建立C#專案。
專案類型應該是「主控台」,可在[範本]>[VisualC#]>[Windows桌面]>[主控台應用程式(.NETFramework)]下找到。
在Program.cs檔案中,利用下列步驟取代程式碼的起始行:
複製並貼上下列程式碼區塊(以其出現的相同順序),請參閱連線到資料庫、產生T-SQL,以及提交至資料庫。
變更Main方法中的下列值:
cb.DataSource
cb.UserID
cb.Password
cb.InitialCatalog
確認已參照System.Data.dll組件。
若要確認,請展開[方案總管]窗格中的[參考]節點。
若要從VisualStudio建置及執行程式,請選取[啟動]按鈕。
報告輸出會顯示在程式視窗中,而GUID值會隨著測試回合有所不同。
=================================
T-SQLto2-Create-Tables...
-1=rowsaffected.
=================================
T-SQLto3-Inserts...
8=rowsaffected.
=================================
T-SQLto4-Update-Join...
2=rowsaffected.
=================================
T-SQLto5-Delete-Join...
2=rowsaffected.
=================================
Now,SelectEmployees(6)...
8ddeb8f5-9584-4afe-b7ef-d6bdca02bd35,Alison,20,acct,Accounting
9ce11981-e674-42f7-928b-6cc004079b03,Barbara,17,hres,HumanResources
315f5230-ec94-4edd-9b1c-dd45fbb61ee7,Carol,22,acct,Accounting
fcf4840a-8be3-43f7-a319-52304bf0f48d,Elle,15,NULL,NULL
Viewthereportoutputhere,thenpressanykeytoendtheprogram...
使用ADO.NET連線至SQLDatabase
usingSystem;
usingSystem.Data.SqlClient;//System.Data.dll
//usingSystem.Data;//For:SqlDbType,ParameterDirection
namespacecsharp_db_test
{
classProgram
{
staticvoidMain(string[]args)
{
try
{
varcb=newSqlConnectionStringBuilder();
cb.DataSource="your_server.database.windows.net";
cb.UserID="your_user";
cb.Password="your_password";
cb.InitialCatalog="your_database";
using(varconnection=newSqlConnection(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(SqlExceptione)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("Viewthereportoutputhere,thenpressanykeytoendtheprogram...");
Console.ReadKey();
}
可傳回T-SQL陳述式的方法
staticstringBuild_2_Tsql_CreateTables()
{
return@"
DROPTABLEIFEXISTStabEmployee;
DROPTABLEIFEXISTStabDepartment;--Dropparenttablelast.
CREATETABLEtabDepartment
(
DepartmentCodenchar(4)notnullPRIMARYKEY,
DepartmentNamenvarchar(128)notnull
);
CREATETABLEtabEmployee
(
EmployeeGuiduniqueIdentifiernotnulldefaultNewId()PRIMARYKEY,
EmployeeNamenvarchar(128)notnull,
EmployeeLevelintnotnull,
DepartmentCodenchar(4)null
REFERENCEStabDepartment(DepartmentCode)--(REFERENCESwouldbedisallowedontemporarytables.)
);
";
}
staticstringBuild_3_Tsql_Inserts()
{
return@"
--Thecompanyhasthesedepartments.
INSERTINTOtabDepartment(DepartmentCode,DepartmentName)
VALUES
('acct','Accounting'),
('hres','HumanResources'),
('legl','Legal');
--Thecompanyhastheseemployees,eachinonedepartment.
INSERTINTOtabEmployee(EmployeeName,EmployeeLevel,DepartmentCode)
VALUES
('Alison',19,'acct'),
('Barbara',17,'hres'),
('Carol',21,'acct'),
('Deborah',24,'legl'),
('Elle',15,null);
";
}
staticstringBuild_4_Tsql_UpdateJoin()
{
return@"
DECLARE@DName1nvarchar(128)=@csharpParmDepartmentName;--'Accounting';
--Promoteeveryoneinonedepartment(see@parm...).
UPDATEempl
SET
empl.EmployeeLevel+=1
FROM
tabEmployeeasempl
INNERJOIN
tabDepartmentasdeptONdept.DepartmentCode=empl.DepartmentCode
WHERE
dept.DepartmentName=@DName1;
";
}
staticstringBuild_5_Tsql_DeleteJoin()
{
return@"
DECLARE@DName2nvarchar(128);
SET@DName2=@csharpParmDepartmentName;--'Legal';
--RightsizetheLegaldepartment.
DELETEempl
FROM
tabEmployeeasempl
INNERJOIN
tabDepartmentasdeptONdept.DepartmentCode=empl.DepartmentCode
WHERE
dept.DepartmentName=@DName2
--DisbandtheLegaldepartment.
DELETEtabDepartment
WHEREDepartmentName=@DName2;
";
}
staticstringBuild_6_Tsql_SelectEmployees()
{
return@"
--LookatallthefinalEmployees.
SELECT
empl.EmployeeGuid,
empl.EmployeeName,
empl.EmployeeLevel,
empl.DepartmentCode,
dept.DepartmentName
FROM
tabEmployeeasempl
LEFTOUTERJOIN
tabDepartmentasdeptONdept.DepartmentCode=empl.DepartmentCode
ORDERBY
EmployeeName;
";
}
將T-SQL提交至資料庫
staticvoidSubmit_6_Tsql_SelectEmployees(SqlConnectionconnection)
{
Console.WriteLine();
Console.WriteLine("=================================");
Console.WriteLine("Now,SelectEmployees(6)...");
stringtsql=Build_6_Tsql_SelectEmployees();
using(varcommand=newSqlCommand(tsql,connection))
{
using(SqlDataReaderreader=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));
}
}
}
}
staticvoidSubmit_Tsql_NonQuery(
SqlConnectionconnection,
stringtsqlPurpose,
stringtsqlSourceCode,
stringparameterName=null,
stringparameterValue=null
)
{
Console.WriteLine();
Console.WriteLine("=================================");
Console.WriteLine("T-SQLto{0}...",tsqlPurpose);
using(varcommand=newSqlCommand(tsqlSourceCode,connection))
{
if(parameterName!=null)
{
command.Parameters.AddWithValue(//Or,useSqlParameterclass.
parameterName,
parameterValue);
}
introwsAffected=command.ExecuteNonQuery();
Console.WriteLine(rowsAffected+"=rowsaffected.");
}
}
}//EndOfClass
}
後續步驟
在本教學課程中,您已了解基本的資料庫工作,例如建立資料庫和資料表、連線至資料庫、載入資料,以及執行查詢。
您已了解如何︰
使用Azure入口網站建立資料庫
使用Azure入口網站設定伺服器層級的IP防火牆規則
使用ADO.NET和VisualStudio連線到資料庫
使用ADO.NET建立資料表
使用ADO.NET插入、更新和刪除資料
使用ADO.NET查詢資料
請前進到下一個教學課程,以了解資料移轉。
使用DMS在離線狀態下將SQLServer遷移至AzureSQLDatabase
此頁面有所助益嗎?
Yes
No
還有其他意見反應嗎?
系統會將意見反應傳送給Microsoft:按下[提交]按鈕,您的意見反應將用來改善Microsoft產品和服務。
隱私權原則。
跳過
送出
謝謝。
此頁面有所助益嗎?
Yes
No
還有其他意見反應嗎?
系統會將意見反應傳送給Microsoft:按下[提交]按鈕,您的意見反應將用來改善Microsoft產品和服務。
隱私權原則。
跳過
送出
謝謝。
本文內容
延伸文章資訊
- 1逐步解說:跨關聯性查詢(C#) - ADO.NET
本逐步解說示範如何使用LINQ to SQL 關聯來表示資料庫中的外鍵關聯性。 注意. 在下列指示的某些Visual Studio 使用者介面項目中,您的電腦可能會顯示 ...
- 2逐步解說:操作資料(C#) - ADO.NET
下載資料庫之後,請將northwnd.mdf 檔案複製至c:\linqtest6 資料夾。 會從Northwind 資料庫產生C# 程式碼檔案。 您可以使用物件關聯式設計工具或SQLMetal ...
- 3【C#】連接資料庫實作(MSSQL) | 阿猩的程式蛋糕店 - 點部落
這篇要介紹關聯性資料庫,筆者選用MSSQL作為後續工作使用,筆者試著用簡單的概念來說明,順便作個工作紀錄囉。內容範圍包含: SQL、T-SQL、DBMS、RDB.
- 4逐步解說:簡單的物件模型和查詢(C#) - ADO.NET
遵循這個逐步解說,建立在範例資料庫中建立資料表模型的實體類別。 然後建立簡單的查詢, ... 一般來說,您會使用物件關聯式設計工具來建立物件模型。
- 5使用C# 設計您的第一個關聯式資料庫- Azure SQL Database
Azure SQL Database 是Microsoft Cloud (Azure) 中的關聯式資料庫即服務(DBaaS)。 在本教學課程裡,您將了解如何搭配使用Visual Studio 與...