将命令类型从文本更改为存储过程会使datareader停止运行

时间:2016-01-25 12:45:38

标签: c# sql sql-server visual-studio stored-procedures

我有一个在VS2010中构建的C#Web表单项目,我想从使用硬编码的SQL查询转到存储过程来查询我的SQL Server数据库,以便我可以使用参数。

我在使用sql数据读取器从数据库读取数据时遇到困难的代码,并创建一个逗号分隔的字符串,用于使用jquery自动完成的文本框的可用值列表。

这在使用硬编码的sql时工作正常,但是当我尝试将其更改为存储过程并添加参数时,文本框没有可用的值。当我调试这个时,我可以看到while (reader.Read())内的代码没有运行。这意味着没有运行创建逗号分隔字符串的代码。

使用硬编码SQL(可行)

string mySQLQuery = "SELECT col1 from table1"
using (SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString))
using (SqlCommand command = new SqlCommand(mySQLQuery, myConnection))
{
    myConnection.Open();
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            //code to create comma separated string
        }
    }
}

转换为使用存储过程(这不起作用)

using (SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString))
using (SqlCommand myCommand = new SqlCommand("storedProcedureName", myConnection))
{
    myCommand.CommandType = CommandType.StoredProcedure;

    myCommand.Parameters.Add("@param1", SqlDbType.VarChar).Value = value1;
    myCommand.Parameters.Add("@param2", SqlDbType.VarChar).Value = value2;

    myConnection.Open();
    using (SqlDataReader reader = myCommand.ExecuteReader())
    {
        while (reader.Read())
        {
            //code to create comma separated string
        }
    }
}

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

我认为param的名称应该没有@但它取决于数据库。我没有使用“@”来使用MSSQL而且它可以工作

我只在sql命令中使用@前缀。

"Select * from table where name = @name"

改变这个:

myCommand.Parameters.Add("@param1", SqlDbType.VarChar).Value = value1;

到此:

myCommand.Parameters.Add("param1", SqlDbType.VarChar).Value = value1;

for param2是相同的

答案 1 :(得分:0)

我已经成功解决了这个问题,问题在于传递给存储过程的参数值,这些参数包含在我没有包含的代码中。

这些值正在传递给存储过程但是该过程没有返回任何值,这就是为什么它似乎被跳过了while(myreader.read())行。

现在代码工作正常,感谢大家的帮助。