資源組
如需有效的資源組名稱,請(qǐng)參閱 rules and (命名規(guī)則和限制)。
選擇源
指定應(yīng)創(chuàng)建空白數(shù)據(jù)庫(kù)。
選擇“服務(wù)器”,使用現(xiàn)有服務(wù)器或創(chuàng)建和配置新服務(wù)器。 選擇現(xiàn)有服務(wù)器或選擇“創(chuàng)建新服務(wù)器”,然后在“新建服務(wù)器”表單中填寫以下信息:
設(shè)置建議的值說明
服務(wù)器名稱
任何全局唯一名稱
如需有效的服務(wù)器名稱,請(qǐng)參閱 rules and (命名規(guī)則和限制)。
服務(wù)器管理員登錄名
任何有效的名稱
如需有效的登錄名,請(qǐng)參閱 (數(shù)據(jù)庫(kù)標(biāo)識(shí)符)。
密碼
任何有效的密碼
密碼必須至少有八個(gè)字符,且必須使用以下類別中的三個(gè)類別的字符:大寫字符、小寫字符、數(shù)字以及非字母數(shù)字字符。
位置
任何有效的位置
有關(guān)區(qū)域的信息,請(qǐng)參閱 Azure 區(qū)域。
選擇“選擇” 。
選擇“定價(jià)層”,指定服務(wù)層級(jí)、DTU 或 vCore 數(shù),以及存儲(chǔ)量。 可以瀏覽相關(guān)選項(xiàng),了解每個(gè)服務(wù)層級(jí)可提供的 DTU/vCore 數(shù)和存儲(chǔ)。
選擇服務(wù)層、DTU 數(shù)或 vCore 數(shù)以及存儲(chǔ)量后,選擇“應(yīng)用”。
輸入空白數(shù)據(jù)庫(kù)的“排序規(guī)則”(就本教程來說,請(qǐng)使用默認(rèn)值)。 有關(guān)排序規(guī)則的詳細(xì)信息,請(qǐng)參閱 (排序規(guī)則)
填寫 SQL 數(shù)據(jù)庫(kù)表單后,選擇“創(chuàng)建”以預(yù)配數(shù)據(jù)庫(kù)。 這個(gè)步驟可能需要幾分鐘的時(shí)間。
在工具欄上,選擇“通知”監(jiān)視部署過程。
創(chuàng)建服務(wù)器級(jí) IP 防火墻規(guī)則
SQL 數(shù)據(jù)庫(kù)在服務(wù)器級(jí)別創(chuàng)建 IP 防火墻。 此防火墻阻止外部應(yīng)用程序和工具連接到服務(wù)器和服務(wù)器上的任何數(shù)據(jù)庫(kù),除非防火墻規(guī)則允許其 IP 通過防火墻。 若要啟用與數(shù)據(jù)庫(kù)的外部連接,必須首先為 IP 地址(或 IP 地址范圍)添加 IP 防火墻規(guī)則。 遵循這些步驟創(chuàng)建服務(wù)器級(jí) IP 防火墻規(guī)則。
重要
通過端口 1433 進(jìn)行的 SQL 數(shù)據(jù)庫(kù)通信。 如果嘗試從企業(yè)網(wǎng)絡(luò)內(nèi)部連接到此服務(wù),則該網(wǎng)絡(luò)的防火墻可能不允許經(jīng)端口 1433 的出站流量。 如果是這樣.net 配置數(shù)據(jù)庫(kù)連接,則無法連接到數(shù)據(jù)庫(kù),除非管理員打開端口 1433。
部署完成后,在左側(cè)菜單中選擇“SQL 數(shù)據(jù)庫(kù)”,然后在“SQL 數(shù)據(jù)庫(kù)”頁(yè)上選擇“”。 此時(shí)會(huì)打開數(shù)據(jù)庫(kù)的概覽頁(yè),其中顯示了完全限定的“服務(wù)器名稱”(例如 ),并提供了其他配置的選項(xiàng)。
復(fù)制此完全限定的服務(wù)器名稱,將其用于從 SQL 連接到服務(wù)器和數(shù)據(jù)庫(kù)。
在“設(shè)置”下選擇“網(wǎng)絡(luò)” 。 選擇“公共訪問”選項(xiàng)卡,然后選擇“公用網(wǎng)絡(luò)訪問”下的“所選網(wǎng)絡(luò)”以顯示“防火墻規(guī)則”部分。
在工具欄上選擇“添加客戶端 IP”,將當(dāng)前的 IP 地址添加到新的 IP 防火墻規(guī)則。 IP 防火墻規(guī)則可以針對(duì)單個(gè) IP 地址或一系列 IP 地址打開端口 1433。
選擇“保存”。 此時(shí)會(huì)針對(duì)當(dāng)前的 IP 地址創(chuàng)建服務(wù)器級(jí) IP 防火墻規(guī)則,在服務(wù)器上打開端口 1433。
選擇“確定”,然后關(guān)閉“防火墻設(shè)置”頁(yè)。
你的 IP 地址現(xiàn)在可以通過 IP 防火墻。 現(xiàn)在可以使用 SQL 或其他所選工具連接到數(shù)據(jù)庫(kù)。 確保使用之前創(chuàng)建的服務(wù)器管理員帳戶。
重要
默認(rèn)情況下,所有 Azure 服務(wù)都允許通過 SQL 數(shù)據(jù)庫(kù) IP 防火墻進(jìn)行訪問。 在此頁(yè)上選擇“關(guān)”即可禁用對(duì)所有 Azure 服務(wù)的訪問。
C# 程序示例
本文的后續(xù)部分介紹了一個(gè) C# 程序,該程序使用 ADO.NET 將 -SQL (T-SQL) 語(yǔ)句發(fā)送到 SQL 數(shù)據(jù)庫(kù)。 該 C# 程序演示以下操作:
實(shí)體關(guān)系圖 (ERD)
TABLE 語(yǔ)句涉及 關(guān)鍵字,該關(guān)鍵字用于在兩個(gè)表之間創(chuàng)建外鍵 (FK) 關(guān)系。 如果使用 ,請(qǐng)通過一對(duì)前導(dǎo)短劃線注釋掉 -- 關(guān)鍵字。
ERD 顯示兩個(gè)表之間的關(guān)系。 . 子列中的值僅限 . 父列中的值。
注意
可以選擇編輯 T-SQL,以便向表名添加前導(dǎo) #,從而在 中以臨時(shí)表的形式創(chuàng)建這些表。 在沒有測(cè)試數(shù)據(jù)庫(kù)可用時(shí),可以通過這種方法進(jìn)行演示。 使用外鍵期間不強(qiáng)制要求對(duì)外鍵進(jìn)行任何引用,程序完成運(yùn)行后關(guān)閉連接時(shí),將自動(dòng)刪除臨時(shí)表。
編譯和運(yùn)行步驟
該 C# 程序在邏輯上是一個(gè) .cs 文件.net 配置數(shù)據(jù)庫(kù)連接,在物理上劃分成多個(gè)代碼塊,使每個(gè)塊更易于理解。 若要編譯和運(yùn)行該程序,請(qǐng)執(zhí)行以下步驟:
在 中創(chuàng)建 C# 項(xiàng)目。 項(xiàng)目類型應(yīng)該是“控制臺(tái)”,可在“模板”>“ C#”>“ 桌面”>“控制臺(tái)應(yīng)用(.NET )”下找到。
在 .cs 文件中,通過以下步驟替換起始代碼行:
按相同的顯示順序復(fù)制并粘貼以下代碼塊;請(qǐng)參閱、 和。
更改 Main 方法中的以下值:
驗(yàn)證是否已引用程序集 .Data.dll。 若要進(jìn)行驗(yàn)證,請(qǐng)?jiān)凇敖鉀Q方案資源管理器”窗格中展開“引用”節(jié)點(diǎn)。
若要在 中生成并運(yùn)行該程序,請(qǐng)選擇“啟動(dòng)”按鈕。 報(bào)告輸出將顯示在程序窗口中,不過,GUID 值根據(jù)測(cè)試運(yùn)行的不同而異。
=================================
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...
使用 ADO.NET 連接到 SQL 數(shù)據(jù)庫(kù)
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();
}
返回 T-SQL 語(yǔ)句的方法
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;
";
}
將 T-SQL 提交到數(shù)據(jù)庫(kù)
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
}
后續(xù)步驟
本教程介紹了基本數(shù)據(jù)庫(kù)任務(wù),例如創(chuàng)建數(shù)據(jù)庫(kù)和表、連接到數(shù)據(jù)庫(kù)、加載數(shù)據(jù)和運(yùn)行查詢。 你已了解如何執(zhí)行以下操作:
請(qǐng)轉(zhuǎn)到下一教程,了解數(shù)據(jù)遷移。
使用 DMS 將 SQL 脫機(jī)遷移到 Azure SQL 數(shù)據(jù)庫(kù)