csharp,string query = "SELECT * FROM Users WHERE UserId = @UserId";,using (SqlConnection connection = new SqlConnection(connectionString)),{, SqlCommand command = new SqlCommand(query, connection);, command.Parameters.AddWithValue("@UserId", userId);, connection.Open();, SqlDataReader reader = command.ExecuteReader();, while (reader.Read()), {, // 处理查询结果, },},
“
1、使用SqlConnection类
首先需要引入System.Data.SqlClient
命名空间。
创建SqlConnection
对象,并指定数据库的连接字符串,该字符串包含服务器地址、数据库名称、用户名、密码等信息。
string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
SqlConnection connection = new SqlConnection(connectionString);
然后调用connection.Open()
方法打开数据库连接。
2、使用其他数据库连接类(针对非SQL Server数据库)
对于MySQL数据库,需要引入MySql.Data.MySqlClient
命名空间,然后使用MySqlConnection
类以类似的方式创建连接对象并打开连接。
对于Oracle数据库,需要引入Oracle.DataAccess.Client
或Oracle.ManagedDataAccess.Client
命名空间,使用OracleConnection
类进行连接操作。
1、使用SqlCommand类执行查询
创建SqlCommand
对象,将连接对象和要执行的SQL查询语句作为参数传递,要查询名为Users
表中的所有用户信息,可以这样写:
string query = "SELECT * FROM Users";
SqlCommand command = new SqlCommand(query, connection);
调用command.ExecuteReader()
方法执行查询,该方法返回一个SqlDataReader
对象,通过它可以逐行读取查询结果。
while (reader.Read())
{
Console.WriteLine(reader["UserName"].ToString());
}
不要忘记关闭SqlDataReader
对象和数据库连接,可以使用using
语句来自动管理资源释放,
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["UserName"].ToString());
}
}
}
}
}
2、使用ExecuteScalar方法获取单个值
如果查询只需要返回一个值,比如查询某个用户的ID,可以使用ExecuteScalar
方法。
string query = "SELECT UserID FROM Users WHERE UserName='JohnDoe'";
SqlCommand command = new SqlCommand(query, connection);
object result = command.ExecuteScalar();
如果查询有结果,result
将包含查询返回的值,否则为null
,可以将结果转换为适当的数据类型,
int userId = Convert.ToInt32(result);
3、使用ExecuteNonQuery方法执行更新、插入和删除操作
对于不返回数据的SQL语句,如INSERT
、UPDATE
和DELETE
,可以使用ExecuteNonQuery
方法,要向Users
表中插入一条新记录,可以这样写:
string insertQuery = "INSERT INTO Users (UserName, UserAge) VALUES (@UserName, @UserAge)";
SqlCommand command = new SqlCommand(insertQuery, connection);
command.Parameters.AddWithValue("@UserName", "JaneDoe");
command.Parameters.AddWithValue("@UserAge", 25);
int rowsAffected = command.ExecuteNonQuery();
rowsAffected
将包含受影响的行数。
1、读取数据行
当使用SqlDataReader
对象读取查询结果时,可以通过索引或列名来访问每一行的数据。
while (reader.Read())
{
int id = reader.GetInt32(0);
string name = reader["UserName"].ToString();
int age = reader.GetInt32("UserAge");
Console.WriteLine("ID: {0}, Name: {1}, Age: {2}", id, name, age);
}
2、处理空值
如果查询结果中某列可能包含空值,需要在读取数据时进行检查,可以使用DBNull.Value
来判断是否为空值。
if (reader["UserAge"] != DBNull.Value)
{
int age = reader.GetInt32("UserAge");
}
也可以使用可空类型来处理可能为空的列,
int? age = reader["UserAge"] == DBNull.Value ? (int?)null : reader.GetInt32("UserAge");
1、防止SQL注入攻击
为了避免SQL注入攻击,应该使用参数化查询而不是直接将用户输入拼接到SQL语句中,在创建SqlCommand
对象时,可以通过添加参数的方式来实现参数化查询。
string query = "SELECT * FROM Users WHERE UserName=@UserName";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@UserName", userInput);
userInput
是用户输入的用户名,这样即使用户输入了反面代码,也不会被当作SQL语句的一部分来执行。
2、使用参数的好处
除了防止SQL注入攻击外,参数化查询还可以提高性能,因为数据库可以重用执行计划,它也使代码更加清晰和易于维护。
C#中执行数据库简单查询语句需要先建立数据库连接,然后使用合适的命令对象执行查询,并对查询结果进行处理,在实际应用中,还需要注意异常处理、资源管理和安全性等方面的问题。