2017-10-05 94 views
-1

我正在查看参数化查询问题我无法找到使用SqlDataReader和参数化查询来填充下拉列表的示例。眼下如何使用SqlDataReader在c#中的参数化查询?

我可以填充我下拉就好在这里用我的代码

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); 

那么,如何才能让我喜欢第二个例子中第一个查询?

感谢

nammrick

+0

我不知道,但我可以probabky工作,这也使谷歌搜索你...你确定你应该有'go.ExecuteNonQuery(); '在那里 - 我不认为它在这种情况下做任何事情。 –

+0

下面是“使用筛选条件执行SQL查询”下的示例:https://www.aspsnippets.com/Articles/Parameterized-Queries-ADO.Net.aspx –

+0

是的,它执行select语句 – nammrick

回答

4

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

可以使用ExecuteNonQuery来执行目录操作( 例如,查询数据库的结构或创建数据库 对象,如表),或改变数据在没有 的数据库中使用DataSet执行UPDATE,INSERT或DELETE语句

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

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 
} 

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

更多的例子:

How to use string variable in sql statement

How to use sql parameters for a select query?