在后面的代码中声明一个变量

时间:2014-09-10 05:31:08

标签: c# sql-server-2008

这是我的存储过程。

DECLARE @listStr VARCHAR(500)   
    select @listStr = COALESCE(@listStr + ';' ,'') + eml_ID from EmailGroup where eml_Level=3 and eml_Stat=1
SELECT @listStr

当我在我的代码后面调用此SP时,我没有问题。我想要做的是把这个SP放在我的代码背后。这就是我在我的代码背后所尝试的。

   using (SqlConnection sqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
        {
            string stR = @"select @listStr = COALESCE(@listStr + ';' ,'') + eml_ID from EmailGroup where eml_Level=3 and eml_Stat=1";

            using (SqlCommand cmD = new SqlCommand(stR, sqlConn))
            {
                sqlConn.Open();
                SqlDataReader dR = cmD.ExecuteReader();
                cmD.Parameters.Add("@listStr", SqlDbType.VarChar);


                while (dR.Read())
                {
                    string emailFullName = Session["UserFullName"].ToString(); 
                    string email = Session["UserEmailAdd"].ToString();
                     //more code here
                 }

当我尝试这种方法时。我收到错误“必须声明标量变量”@listStr“。 我的问题是如何在代码中声明变量?

4 个答案:

答案 0 :(得分:0)

你需要声明listStr的值,试试这个:

cmD.Parameters.Add("@listStr", SqlDbType.VarChar, 15, "test");

cmD.Parameters.Add("@listStr", SqlDbType.VarChar).Value = "test";

编译器正在SELECT语句中查找@listStr,该语句未声明。您需要使用以下内容更改查询:

using (SqlConnection sqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
{
    using (SqlCommand cmD = new SqlCommand("StoredProcName", sqlConn) { CommandType = CommandType.StoredProcedure })
    {
        sqlConn.Open();
        SqlDataReader dR = cmD.ExecuteReader();
        cmD.Parameters.Add("@listStr", SqlDbType.VarChar).Value = "test";


        while (dR.Read())
        {
            string emailFullName = Session["UserFullName"].ToString(); 
            string email = Session["UserEmailAdd"].ToString();
             //more code here
         }
     }
 }

答案 1 :(得分:0)

select @listStr = COALESCE(....

应填充变量,但不会返回您可以使用

读取的结果集
while (dR.Read()) {}

如果要对结果执行查询,则应删除变量赋值...

select COALESCE(....

当您表示查询时,您是说存储过程吗?存储过程是一个命名的“函数”,它需要参数并返回数据。存储过程包含一个或多个查询,如上面所写的内容。

答案 2 :(得分:0)

您在变量声明后面的代码中省略了。

DECLARE @listStr VARCHAR(500); 

您的代码应为:

using (SqlConnection sqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
    {
        string stR = @"DECLARE @listStr VARCHAR(500); select @listStr = COALESCE(@listStr + ';' ,'') + eml_ID from EmailGroup where eml_Level=3 and eml_Stat=1";

        using (SqlCommand cmD = new SqlCommand(stR, sqlConn))
        {
          // Omitted

注意用分号分隔你的陈述;

答案 3 :(得分:0)

您提到了存储过程,我强烈建议您利用将数据库实现与DAL实现分离。

首先在适当的DB中创建存储过程:

        USE myActualDb /* use the actual db name */
        GO

        CREATE PROCEDURE GetEmailList
            @eml_level int, /* use the actual datatype */
            @eml_stat int,  /* use the actual datatype */
        AS
        BEGIN
            DECLARE @listStr VARCHAR(500)   

            SELECT @listStr = COALESCE(@listStr + ';' ,'') + eml_ID
            FROM EmailGroup
            WHERE eml_Level = @eml_level AND eml_Stat = @eml_stat

            SELECT @listStr
        END

然后使用ADO.NET SqlClient调用存储的代码隐藏:

        var emlLevel = levelValue;
        var emlStat = statValue;

        using (SqlConnection sqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.Connection = sqlConn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "GetEmailList";
                cmd.Parameters.Add(new SqlParameter("eml_level", emlLevel));
                cmd.Parameters.Add(new SqlParameter("eml_level", emlStat));

                sqlConn.Open();
                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    /* do whatever you need with the dr result */
                }


                /* clean up*/
            }
        }