这是我的存储过程。
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“。 我的问题是如何在代码中声明变量?
答案 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*/
}
}