使用 DbConnection、SqlConnection、SqlCommand、DbCommand 等连接到数据库

Connect to the Database with DbConnection, SqlConnection, SqlCommand, DbCommand, etc

我研究了使用 ado.net 建立与数据库的连接。我被 DbConnectionSqlConnectionSqlCommandDbCommand 弄糊涂了。谁能告诉我区别?

我用谷歌搜索了这些术语,这些 DB 前缀似乎是这些 Sql 前缀的基础 class。

那么我们什么时候应该使用这些 Sql 前缀 (SqlConnection) 以及什么时候应该使用 DB 前缀 (DbConnection)?

另外,如果我将连接字符串放在App.configWeb.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" 意义上的连接,则可以使用 DbConnectionSqlConnection 将比 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
            }
        }
    }