【问题标题】:How to use SqlDataReader with a parametrized query in c#?如何在 c# 中将 SqlDataReader 与参数化查询一起使用?
【发布时间】:2017-10-05 03:11:52
【问题描述】:

我正在查看参数化查询问题,但找不到将SqlDataReader 与参数化查询一起使用来填充下拉列表的示例。

现在我可以在这里使用我的代码很好地填充我的下拉列表

if (!this.IsPostBack)
{
    using (SqlConnection con = new SqlConnection(SQLConnectionString))
    {
        System.Data.SqlClient.SqlCommand go = new System.Data.SqlClient.SqlCommand();

        con.Open();
        go.Connection = con;
        go.CommandText = "SELECT InsuredID, FirstName, LastName FROM [Lab2].[dbo].[INSURED]";
        go.ExecuteNonQuery();

        SqlDataReader readIn = go.ExecuteReader();

        while (readIn.Read())
        {
            ddlHomeInsuredID.Items.Add(
                new ListItem(readIn["InsuredID"].ToString() + " : " + readIn["FirstName"].ToString()
                + " " + readIn["LastName"].ToString()));
        }

        con.Close();

        ddlHomeInsuredID.Items.Insert(0, new ListItem("--Select InsuredID--", "0"));
    }
}

但是,我想让这个 select 语句参数化。我怎样才能做到这一点? 我很乐意编写如下参数化的插入语句:

using (SqlConnection connection = new SqlConnection(SQLConnectionString))
{
    SqlCommand command = new SqlCommand();
    command.Connection = connection;
    command.CommandType = System.Data.CommandType.Text;

    command.CommandText = @"INSERT INTO [Lab2].[dbo].[INSURED] ([FirstName], [LastName], [MI], [DateOfBirth], 
[CreditScore], [AddressID], [DriversLicenseNumber], [LastUpdatedBy], [LastUpdated]) VALUES
(@firstName, @lastName, @middleInitial, @dateOfBirth, @creditScore, @addressID,
@driversLicenseNumber, @lastUpdatedBy, @lastUpdated)";

    command.Parameters.Add("@firstName", SqlDbType.VarChar, 20).Value = Insured.insuredArr[j].getFirstName();
    command.Parameters.Add("@lastName", SqlDbType.VarChar, 30).Value = Insured.insuredArr[j].getLastName();
    command.Parameters.Add("@middleInitial", SqlDbType.Char, 1).Value = Insured.insuredArr[j].getMiddleInitial();
    command.Parameters.Add("@dateOfBirth", SqlDbType.VarChar, 30).Value = Insured.insuredArr[j].getDateOfBirth();
    command.Parameters.Add("@creditScore", SqlDbType.Int).Value = Insured.insuredArr[j].getCreditScore();
    command.Parameters.Add("@addressID", SqlDbType.Int).Value = Insured.insuredArr[j].getAddressID();
    command.Parameters.Add("@driversLicenseNumber", SqlDbType.VarChar, 30).Value = Insured.insuredArr[j].getDriversLicenseNumber();
    command.Parameters.Add("@lastUpdatedBy", SqlDbType.VarChar, 20).Value = Insured.insuredArr[j].getLastUpdatedBy();
    command.Parameters.Add("@lastUpdated", SqlDbType.Date).Value = Insured.insuredArr[j].getLastUpdated();

    connection.Open();
    command.ExecuteNonQuery();
    connection.Close();
}

MsgBox("Record(s) inserted into database", this.Page, this);

那么,我怎样才能像第二个示例一样进行第一个查询?

谢谢

纳姆瑞克

【问题讨论】:

  • 我不确定,但我可以通过谷歌搜索解决它...你确定你应该在那里有go.ExecuteNonQuery(); 行 - 我认为在这种情况下它没有做任何事情。
  • 下面是“使用过滤条件执行 SQL 查询”下的示例:aspsnippets.com/Articles/Parameterized-Queries-ADO.Net.aspx
  • 没错就是执行select语句
  • ...go.ExecuteReader(); 在下一行对吗?为什么要执行两次?
  • ExecuteNonQuery 并不意味着执行选择语句。否则,您实际上是在进行查询。这是针对您不关心的输出的语句。

标签: c# sql-server sqldatareader parameterized-query


【解决方案1】:

首先,ExecuteNonQuery() 方法的使用对SELECT 查询无效,只要坚持使用ExecuteReader(),因为您要返回查询结果。这是ExecuteNonQuery方法的使用说明:

您可以使用 ExecuteNonQuery 来执行目录操作(例如 例如,查询数据库的结构或创建数据库 对象(例如表),或更改数据库中的数据,而无需 通过执行 UPDATE、INSERT 或 DELETE 语句来使用 DataSet。

修改后的查询流程应该是这样的:

using (SqlConnection con = new SqlConnection(SQLConnectionString))
{
    SqlCommand go = new SqlCommand();

    con.Open();
    go.Connection = con;
    go.CommandText = "SELECT InsuredID, FirstName, LastName FROM [Lab2].[dbo].[INSURED]";

    SqlDataReader readIn = go.ExecuteReader();
    while (readIn.Read())
    {
       // reading data from reader
    }

    con.Close();

    // other stuff
}

如果您想对SELECT 语句使用参数化查询,您需要在WHERE 子句中包含至少一列(和一个参数名称)(参见下面的示例):

SELECT InsuredID, FirstName, LastName FROM [Lab2].[dbo].[INSURED] WHERE InsuredID = @InsuredID

然后,您可以使用SqlParameter 将参数值传递到上面的查询中:

using (SqlConnection con = new SqlConnection(SQLConnectionString))
{
    System.Data.SqlClient.SqlCommand go = new System.Data.SqlClient.SqlCommand();

    con.Open();
    go.Connection = con;
    go.CommandText = "SELECT InsuredID, FirstName, LastName FROM [Lab2].[dbo].[INSURED] WHERE InsuredID = @InsuredID";
    go.Parameters.Add("@InsuredID", SqlDbType.Int).Value = 1; // example value for parameter passing

    SqlDataReader readIn = go.ExecuteReader();
    while (readIn.Read())
    {
       // reading data from reader
    }

    con.Close();

    // other stuff
}

注意:避免同时执行INSERT/UPDATE/DELETE操作和SELECT语句以相同的活动连接填充数据,在执行另一个查询之前应先关闭前一个连接。

更多示例:

How to use string variable in sql statement

How to use sql parameters for a select query?

【讨论】:

猜你喜欢
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多