使用 DbConnection、SqlConnection、SqlCommand、DbCommand 等连接到数据库
Connect to the Database with DbConnection, SqlConnection, SqlCommand, DbCommand, etc
我研究了使用 ado.net 建立与数据库的连接。我被 DbConnection
、SqlConnection
、SqlCommand
、DbCommand
弄糊涂了。谁能告诉我区别?
我用谷歌搜索了这些术语,这些 DB 前缀似乎是这些 Sql
前缀的基础 class。
那么我们什么时候应该使用这些 Sql
前缀 (SqlConnection
) 以及什么时候应该使用 DB 前缀 (DbConnection)?
另外,如果我将连接字符串放在App.config
或Web.config
中,是否还需要使用这种格式来打开和关闭连接?
string connString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;";
using (SqlConnection conn = new SqlConnection(connString))
{
}
因为我尝试在 App.config
中添加连接字符串后,似乎我不再需要打开和关闭连接了。
另外,什么时候用SqlParameter?谁能给我举个例子吗?
是从数据库的存储过程传递参数吗?
使用DataTable、DataSet还是reader传值更方便?
DbConnection
描述了与多个数据库对话的通用 API; SqlConnection
是一个 特定的 API 用于与 SQL 服务器对话, 是 一个 DbConnection
.因此,如果您知道您正在与 SQL 服务器通信,则可以使用 SqlConnection
,如果您想谈论抽象 "any server" 意义上的连接,则可以使用 DbConnection
。 SqlConnection
将比 DbConnection
.
为您提供更多特定于提供商的 API
对于参数:基本上,只要您将任何类型的输入传递给任何命令。所以:很多。您可能会发现像 Dapper 或 EF 这样的工具更容易。
对于 DataTable
/DataSet
:这些应该 而不是 是您不再使用的默认设置。它们仍然 有效 ,但通常任何其他方法都更可取。
详细说明 Marc 关于参数的回答。您总是希望使用参数,以便您传入的任何内容始终被视为一个值。一个好处是您不会有单引号之类的字符导致查询失败。我在下面的代码中有一个例子。另一个原因是为了防止 SQL 注入攻击。维基百科有一些很好的例子 https://en.wikipedia.org/wiki/SQL_injection.
private void SingleQuoteExample()
{
string customerName = "John'Smith";
SqlWithParameter(customerName); //This works
SqlWithoutParameter(customerName); //This doesn't because we end up with
//SELECT * FROM CUSTOMERS WHERE CUSTOMERNAME = 'JOHN'SMITH'
//Which from SQLs point of view has an extra single quote
}
private void SqlWithParameter(string customerName)
{
string constr = "DataSource......";
using (SqlConnection con = new SqlConnection(constr))
{
con.Open();
string queryStr = "SELECT * FROM CUSTOMERS WHERE CUSTOMERNAME = @CUSTOMERNAME";
using (SqlCommand cmd = new SqlCommand(queryStr, con))
{
cmd.Parameters.AddWithValue("@CUSTOMERNAME", customerName);
//read stuff
}
}
}
private void SqlWithoutParameter(string customerName)
{
string constr = "DataSource......";
using (SqlConnection con = new SqlConnection(constr))
{
con.Open();
string queryStr = "SELECT * FROM CUSTOMERS WHERE CUSTOMERNAME = '" + customerName + "'";
using (SqlCommand cmd = new SqlCommand(queryStr, con))
{
//read stuff
}
}
}
我研究了使用 ado.net 建立与数据库的连接。我被 DbConnection
、SqlConnection
、SqlCommand
、DbCommand
弄糊涂了。谁能告诉我区别?
我用谷歌搜索了这些术语,这些 DB 前缀似乎是这些 Sql
前缀的基础 class。
那么我们什么时候应该使用这些 Sql
前缀 (SqlConnection
) 以及什么时候应该使用 DB 前缀 (DbConnection)?
另外,如果我将连接字符串放在App.config
或Web.config
中,是否还需要使用这种格式来打开和关闭连接?
string connString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;";
using (SqlConnection conn = new SqlConnection(connString))
{
}
因为我尝试在 App.config
中添加连接字符串后,似乎我不再需要打开和关闭连接了。
另外,什么时候用SqlParameter?谁能给我举个例子吗?
是从数据库的存储过程传递参数吗?
使用DataTable、DataSet还是reader传值更方便?
DbConnection
描述了与多个数据库对话的通用 API; SqlConnection
是一个 特定的 API 用于与 SQL 服务器对话, 是 一个 DbConnection
.因此,如果您知道您正在与 SQL 服务器通信,则可以使用 SqlConnection
,如果您想谈论抽象 "any server" 意义上的连接,则可以使用 DbConnection
。 SqlConnection
将比 DbConnection
.
对于参数:基本上,只要您将任何类型的输入传递给任何命令。所以:很多。您可能会发现像 Dapper 或 EF 这样的工具更容易。
对于 DataTable
/DataSet
:这些应该 而不是 是您不再使用的默认设置。它们仍然 有效 ,但通常任何其他方法都更可取。
详细说明 Marc 关于参数的回答。您总是希望使用参数,以便您传入的任何内容始终被视为一个值。一个好处是您不会有单引号之类的字符导致查询失败。我在下面的代码中有一个例子。另一个原因是为了防止 SQL 注入攻击。维基百科有一些很好的例子 https://en.wikipedia.org/wiki/SQL_injection.
private void SingleQuoteExample()
{
string customerName = "John'Smith";
SqlWithParameter(customerName); //This works
SqlWithoutParameter(customerName); //This doesn't because we end up with
//SELECT * FROM CUSTOMERS WHERE CUSTOMERNAME = 'JOHN'SMITH'
//Which from SQLs point of view has an extra single quote
}
private void SqlWithParameter(string customerName)
{
string constr = "DataSource......";
using (SqlConnection con = new SqlConnection(constr))
{
con.Open();
string queryStr = "SELECT * FROM CUSTOMERS WHERE CUSTOMERNAME = @CUSTOMERNAME";
using (SqlCommand cmd = new SqlCommand(queryStr, con))
{
cmd.Parameters.AddWithValue("@CUSTOMERNAME", customerName);
//read stuff
}
}
}
private void SqlWithoutParameter(string customerName)
{
string constr = "DataSource......";
using (SqlConnection con = new SqlConnection(constr))
{
con.Open();
string queryStr = "SELECT * FROM CUSTOMERS WHERE CUSTOMERNAME = '" + customerName + "'";
using (SqlCommand cmd = new SqlCommand(queryStr, con))
{
//read stuff
}
}
}