本页说明如何在 .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 框架程序集;SqlConnectionSqlCommandSqlDataReader 等类型所在命名空间为 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 中添加引用

  1. 在项目浏览器中选中窗体(或控制台)项目 → 右键 → 添加引用(或菜单 项目 → 添加引用)。
  2. .NET 页签中勾选 System.Data(若列表中已单独列出 System.Data.SqlClient 亦可勾选)→ 确定。
  3. 确认引用节点下出现该项。多数模板已默认引用 System.Data;若编译已能解析 SqlConnection,可跳过本步。
  4. 在代码文件顶部加入 using System.Data.SqlClient;(C#)或 Imports System.Data.SqlClient(VB.NET)。
  5. 菜单 编译 → 编译解决方案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 为准(SqlConnectionSqlCommandSqlParameterSqlDataReader)。

建表(可重复执行)

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 释放 SqlConnectionSqlCommandSqlDataReader。长时间占连接会耗尽连接池。
SQL 注入 用户输入一律走参数(@Name),不要字符串拼接进 SQL。
NuGet / 可视化数据源 LCode 主界面 NuGet 包管理、以及「可视化数据库设计器 / 数据源向导」针对 SQL Server 的一站式配置暂不支持,待更新完善。请按本页手工引用与手写 ADO.NET。
Microsoft.Data.SqlClient 若改用该程序集,命名空间变为 Microsoft.Data.SqlClient,部分连接默认值(如加密)可能不同,须对照该包文档调整连接字符串。

相关阅读