C# ADO.NET连接SQL Server数据库实战教程,如何实现数据库连接与操作?
要快速连接并操作SQL Server数据库,最简单的方式是:使用SqlConnection创建连接对象,配合SqlCommand执行SQL命令,并通过SqlDataReader读取数据或ExecuteNonQuery进行更新。
第一步:建立数据库连接
首先,确保你的项目已经引用了System.Data.SqlClient命名空间。然后,你需要一个连接字符串,就像一把钥匙,用来告诉程序怎么找到你的数据库。连接字符串通常包括服务器地址、数据库名称、用户名和密码。比如,如果你的SQL Server装在本机上,数据库名叫TestDB,用户名是sa,密码是123456,那么连接字符串就是:"Data Source=localhost;Initial Catalog=TestDB;User ID=sa;Password=123456"。在实际项目中,为了保护敏感信息,最好把连接字符串写在配置文件里,比如App.config或Web.config。
接下来,创建一个SqlConnection对象,把连接字符串传给它。使用using语句包裹连接对象,这样能确保用完后自动关闭连接,避免资源泄漏。代码看起来像这样:using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); // 执行数据库操作 }。Open()方法会真正打开数据库连接,如果连接失败,会抛出异常,所以最好用try-catch块处理错误。
第二步:执行SQL命令
连接打开后,你就可以执行SQL命令了。这需要SqlCommand对象。根据你的需求,可以用不同的方法:如果要查询数据,用ExecuteReader;如果要插入、更新或删除数据,用ExecuteNonQuery;如果只返回单个值,比如计数,用ExecuteScalar。
假设你想查询一个用户表Users中所有用户的名字。可以这样写:string sql = "SELECT Name FROM Users"; SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { string name = reader["Name"].ToString(); Console.WriteLine(name); } reader.Close();。这里,ExecuteReader返回一个SqlDataReader对象,你可以用它一行行读取数据。记得用完后关闭reader。
如果是插入数据,比如添加一个新用户:string sql = "INSERT INTO Users (Name, Age) VALUES (@Name, @Age)"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@Name", "张三"); cmd.Parameters.AddWithValue("@Age", 25); int rows = cmd.ExecuteNonQuery(); if (rows > 0) Console.WriteLine("插入成功");。这里用了参数化查询,通过Parameters添加参数值,这能防止SQL注入攻击,比直接拼接字符串安全多了。
第三步:处理数据与关闭连接
读取完数据或执行完命令后,记得关闭所有资源。用using语句可以自动处理,但如果你手动创建了SqlDataReader,一定要调用Close()方法。另外,虽然连接在using块结束后会自动关闭,但显式调用conn.Close()也是个好习惯。
有时候,你可能需要处理大量数据,或者执行多个相关操作,这时可以用事务来保证数据一致性。例如:using (SqlTransaction trans = conn.BeginTransaction()) { try { SqlCommand cmd1 = new SqlCommand(sql1, conn, trans); cmd1.ExecuteNonQuery(); SqlCommand cmd2 = new SqlCommand(sql2, conn, trans); cmd2.ExecuteNonQuery(); trans.Commit(); } catch { trans.Rollback(); } }。这样,如果中间出错,所有操作都会回滚,数据库保持原状。
第四步:简单示例与常见错误
这里给一个完整的控制台程序示例,演示如何连接数据库并查询数据:
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
string connStr = "Data Source=localhost;Initial Catalog=TestDB;Integrated Security=True"; // 如果使用Windows身份验证
using (SqlConnection conn = new SqlConnection(connStr))
{
try
{
conn.Open();
string sql = "SELECT * FROM Users";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine($"ID: {reader[\"ID\"]}, Name: {reader[\"Name\"]}");
}
reader.Close();
}
catch (Exception ex)
{
Console.WriteLine("错误: " + ex.Message);
}
}
}
}
常见错误包括:连接字符串写错了、数据库服务没启动、网络问题、权限不足等。如果遇到异常,仔细检查错误信息,通常能快速定位问题。
FAQ
问题一:连接字符串中的Integrated Security=True是什么意思?
答:这表示使用Windows身份验证来连接SQL Server数据库,也就是说,用当前登录Windows系统的用户账号去登录数据库,不需要在连接字符串里提供用户名和密码。如果你的SQL Server设置为混合模式(同时支持Windows身份验证和SQL Server身份验证),你可以用User ID和Password参数来指定SQL Server账号。通常,在开发环境中用Integrated Security=True比较方便,但部署到服务器时,可能需要改成SQL Server身份验证。
问题二:为什么用using语句包裹SqlConnection?不用会怎样?
答:using语句能确保SqlConnection对象在使用完后自动被释放,即使发生异常也会执行清理工作。如果不用using,你需要手动调用conn.Dispose()或conn.Close()来关闭连接,否则数据库连接可能一直开着,浪费资源,甚至导致数据库连接池耗尽,程序无法再连接数据库。所以,养成用using的习惯很重要,它能避免很多潜在问题。
问题三:参数化查询真的能防止SQL注入吗?
答:是的,参数化查询是防止SQL注入的有效方法。当你用Parameters.AddWithValue添加参数时,数据库会把这些值当作数据来处理,而不是SQL代码的一部分。这样,即使用户输入了恶意的SQL片段,比如' OR '1'='1,它也会被当作一个普通的字符串值,不会改变SQL命令的结构。相比之下,如果直接拼接字符串,比如"SELECT * FROM Users WHERE Name='" + userInput + "'",恶意输入就可能改变查询逻辑,导致数据泄露或破坏。所以,任何时候都应该用参数化查询,不要拼接SQL字符串。
引用来源:本文内容基于Microsoft官方文档和常见编程实践,参考了《C#入门经典》和多个实际项目经验。