数据库 · SQL Server
开发专题 · System.Data.SqlClient 引用、连接字符串与增删改查
本页说明如何在 .NET Framework 4.8 窗体(或控制台)项目中使用 SQL Server:在 LCode 中引用 System.Data.SqlClient、编写连接字符串,以及用 ADO.NET 完成增删改查。操作文案以 LCode 中文界面为准;凡有代码均同时给出 C# 5.0 与 VB.NET。网格绑定与自定义列见 数据表单与自定义列;本地文件库见 数据库 · SQLite。
引用哪些 DLL / NuGet 或本地程序集
推荐使用框架自带的 ADO.NET 提供程序 System.Data.SqlClient(命名空间同名)。在 .NET Framework 4.8 上,该程序集通常已随运行时提供,一般无需再下载第三方包;在 LCode 中从「.NET」页签勾选引用即可。
| 文件 / 项 | 作用 |
|---|---|
System.Data.dll / System.Data.SqlClient |
框架程序集;SqlConnection、SqlCommand、SqlDataReader 等类型所在命名空间为 System.Data.SqlClient。在 LCode 中添加.NET 程序集引用 |
NuGet 包 System.Data.SqlClient |
面向跨目标框架的独立包(常见于 .NET Core / 较新栈)。本手册以 .NET Framework 4.8 自带程序集为准。LCode 主界面 NuGet 包管理暂不支持,待更新完善——若你坚持用 NuGet 发行版,请在外部还原后再浏览引用 DLL |
Microsoft.Data.SqlClient |
较新的官方驱动(功能与 TLS/加密默认值等与旧客户端有差异)。在 LCode + .NET Framework 4.8 场景本手册以 System.Data.SqlClient 为准;改用其他程序集时类型名相近、命名空间与连接行为可能不同 |
在 LCode 中添加引用
- 在项目浏览器中选中窗体(或控制台)项目 → 右键 → 添加引用(或菜单 项目 → 添加引用)。
- 在 .NET 页签中勾选
System.Data(若列表中已单独列出System.Data.SqlClient亦可勾选)→ 确定。 - 确认引用节点下出现该项。多数模板已默认引用
System.Data;若编译已能解析SqlConnection,可跳过本步。 - 在代码文件顶部加入
using System.Data.SqlClient;(C#)或Imports System.Data.SqlClient(VB.NET)。 - 菜单 编译 → 编译解决方案(F8),确认无「找不到类型或命名空间」错误。
提示:添加引用的页签与「本地复制」含义见 引用 DLL。框架自带的
System.Data 一般无需设「本地复制」;目标机须安装对应 .NET Framework 4.8。
连接字符串
SQL Server 通过服务器名(或实例名)、数据库名与身份验证方式定位。常用键包括 Data Source(或 Server)、Initial Catalog(或 Database)、以及 Windows 集成身份验证(Integrated Security=True)或 SQL 登录(User ID / Password)。连接前请确认本机或网络上的 SQL Server 服务已启动,且防火墙与登录权限已放行。
| 连接字符串示例 | 说明 |
|---|---|
Data Source=.\SQLEXPRESS;Initial Catalog=AppDb;Integrated Security=True; |
本机 SQL Express 命名实例;Windows 当前用户登录 |
Server=localhost;Database=AppDb;Trusted_Connection=True; |
与上一行等价的常用写法(默认实例) |
Data Source=192.168.1.10,1433;Initial Catalog=AppDb;User ID=appuser;Password=秘密; |
远程主机 + 端口;SQL 身份验证。勿把口令写死进公开仓库 |
Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=AppDb;Integrated Security=True; |
LocalDB(开发机常见);实例名以本机安装为准 |
C#
using System.Data.SqlClient;
string connStr =
"Data Source=.\\SQLEXPRESS;Initial Catalog=AppDb;Integrated Security=True;";
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
// …执行命令…
}
VB.NET
Imports System.Data.SqlClient
Dim connStr As String =
"Data Source=.\SQLEXPRESS;Initial Catalog=AppDb;Integrated Security=True;"
Using conn As New SqlConnection(connStr)
conn.Open()
' …执行命令…
End Using
增删改查
以下示例假定数据库 AppDb 已存在,且表 Items 将按「建表」小节创建(或已预先建好)。参数请用 @Name 占位,避免拼接 SQL。类名以 System.Data.SqlClient 为准(SqlConnection、SqlCommand、SqlParameter、SqlDataReader)。
建表(可重复执行)
C#
const string SqlCreate =
"IF OBJECT_ID(N'dbo.Items', N'U') IS NULL " +
"CREATE TABLE dbo.Items (" +
"Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, " +
"Name NVARCHAR(100) NOT NULL, " +
"Qty INT NOT NULL CONSTRAINT DF_Items_Qty DEFAULT (0));";
using (SqlCommand cmd = new SqlCommand(SqlCreate, conn))
{
cmd.ExecuteNonQuery();
}
VB.NET
Const SqlCreate As String =
"IF OBJECT_ID(N'dbo.Items', N'U') IS NULL " &
"CREATE TABLE dbo.Items (" &
"Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, " &
"Name NVARCHAR(100) NOT NULL, " &
"Qty INT NOT NULL CONSTRAINT DF_Items_Qty DEFAULT (0));"
Using cmd As New SqlCommand(SqlCreate, conn)
cmd.ExecuteNonQuery()
End Using
插入(Create)
C#
using (SqlCommand cmd = new SqlCommand(
"INSERT INTO dbo.Items (Name, Qty) VALUES (@Name, @Qty);", conn))
{
cmd.Parameters.AddWithValue("@Name", "螺丝");
cmd.Parameters.AddWithValue("@Qty", 100);
cmd.ExecuteNonQuery();
}
VB.NET
Using cmd As New SqlCommand(
"INSERT INTO dbo.Items (Name, Qty) VALUES (@Name, @Qty);", conn)
cmd.Parameters.AddWithValue("@Name", "螺丝")
cmd.Parameters.AddWithValue("@Qty", 100)
cmd.ExecuteNonQuery()
End Using
查询(Read)
C#
using (SqlCommand cmd = new SqlCommand(
"SELECT Id, Name, Qty FROM dbo.Items ORDER BY Id;", conn))
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32(0);
string name = reader.GetString(1);
int qty = reader.GetInt32(2);
Console.WriteLine(id + "\t" + name + "\t" + qty);
}
}
VB.NET
Using cmd As New SqlCommand(
"SELECT Id, Name, Qty FROM dbo.Items ORDER BY Id;", conn)
Using reader As SqlDataReader = cmd.ExecuteReader()
While reader.Read()
Dim id As Integer = reader.GetInt32(0)
Dim name As String = reader.GetString(1)
Dim qty As Integer = reader.GetInt32(2)
Console.WriteLine(id & vbTab & name & vbTab & qty)
End While
End Using
End Using
更新(Update)
C#
using (SqlCommand cmd = new SqlCommand(
"UPDATE dbo.Items SET Qty = @Qty WHERE Id = @Id;", conn))
{
cmd.Parameters.AddWithValue("@Qty", 120);
cmd.Parameters.AddWithValue("@Id", 1);
int rows = cmd.ExecuteNonQuery();
Console.WriteLine("更新行数: " + rows);
}
VB.NET
Using cmd As New SqlCommand(
"UPDATE dbo.Items SET Qty = @Qty WHERE Id = @Id;", conn)
cmd.Parameters.AddWithValue("@Qty", 120)
cmd.Parameters.AddWithValue("@Id", 1)
Dim rows As Integer = cmd.ExecuteNonQuery()
Console.WriteLine("更新行数: " & rows)
End Using
删除(Delete)
C#
using (SqlCommand cmd = new SqlCommand(
"DELETE FROM dbo.Items WHERE Id = @Id;", conn))
{
cmd.Parameters.AddWithValue("@Id", 1);
cmd.ExecuteNonQuery();
}
VB.NET
Using cmd As New SqlCommand(
"DELETE FROM dbo.Items WHERE Id = @Id;", conn)
cmd.Parameters.AddWithValue("@Id", 1)
cmd.ExecuteNonQuery()
End Using
填充 DataGridView:可用
SqlDataAdapter + DataTable,再赋给 DataGridView.DataSource。列外观与行编辑流程见 数据表单与自定义列(该页以 Access 为主讲,绑定写法可对照迁移)。
注意事项
| 注意点 | 说明 |
|---|---|
| 服务与实例名 | Data Source 须与本机安装一致(默认实例、命名实例 .\SQLEXPRESS、LocalDB 等)。连不上时先用 SSMS 或 sqlcmd 验证同一连接串。 |
| 身份验证 | Windows 集成身份验证依赖运行进程的 Windows 账户;SQL 登录须在服务器上启用混合模式并授予库权限。部署到服务账户时,集成身份验证的主体会变化。 |
| 网络与防火墙 | 远程连接需开启 TCP、放行端口(默认 1433 或命名实例动态端口),并在 SQL Server 配置管理器中启用远程连接。 |
| 连接与资源 | 短用短关:优先 using/Using 释放 SqlConnection、SqlCommand、SqlDataReader。长时间占连接会耗尽连接池。 |
| SQL 注入 | 用户输入一律走参数(@Name),不要字符串拼接进 SQL。 |
| NuGet / 可视化数据源 | LCode 主界面 NuGet 包管理、以及「可视化数据库设计器 / 数据源向导」针对 SQL Server 的一站式配置暂不支持,待更新完善。请按本页手工引用与手写 ADO.NET。 |
| Microsoft.Data.SqlClient | 若改用该程序集,命名空间变为 Microsoft.Data.SqlClient,部分连接默认值(如加密)可能不同,须对照该包文档调整连接字符串。 |
相关阅读
- 引用 DLL — 浏览托管程序集、「本地复制」与常见加载错误
- 数据表单与自定义列 — DataGridView 绑定与自定义列
- 数据库 · SQLite — 本地文件库对照
- 运行与编译 — 平台目标、输出目录与运行验证
- C# / VB.NET 窗体应用入门 — 可挂接数据库的窗体侧入门