存储过程:
ALTER procedure [dbo].[p_CodeInquiry]
@tableName nvarchar(50),
@boardType nvarchar(50)
as
declare @sql nvarchar(1000)
set @sql='SELECT * FROM '+@tableName+' Where BoardType='+@boardType
exec(@sql) 输入参数:BoardPNCode ‘BTP’ 结果正确(得到了相应的记录)
输入参数:BoardPNCode BTP 提示:列名 'BTP' 无效。(程序把BTP当做列名了,数据库中确实没有这个字段)我在C#程序中用两个string 变量传入参数,同样提示:列名‘BTP'无效C# 程序是这样:
public string[] InquriyCode(string tableName,string boardType)
{
int i = 0;
string[] tempStr=new string[100];
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("p_CodeInquiry", conn);
boardType = boardType.Trim();
SqlParameter m_paraTableName = new SqlParameter("@tableName", tableName);
SqlParameter m_paraBoardType = new SqlParameter("@boardType", boardType);
da.SelectCommand.Parameters.Add(m_paraTableName);
da.SelectCommand.Parameters.Add(m_paraBoardType);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.Fill(ds);//提示:列名'BTP'无效
//后面的不用管
someFunc.SelecttSort(ref ds);
foreach (DataRow dr in ds.Tables[0].Rows)
{
if (dr["ChangeDate"].ToString() == string.Empty || dr["ChangeDate"].ToString() == null)
{
return tempStr;
}
tempStr[i] = dr["ChangeDate"].ToString();
i++;
}
return null;
}现在问题是:我调试发现,boardType的值为:"BTP",请问我怎样才能传入:'BTP'呢???
那位高手能详细叙述一下:在SQL SERVER 2005 C# 中 ‘ “ + 3个符号意思是什么?
ALTER procedure [dbo].[p_CodeInquiry]
@tableName nvarchar(50),
@boardType nvarchar(50)
as
declare @sql nvarchar(1000)
set @sql='SELECT * FROM '+@tableName+' Where BoardType='+@boardType
exec(@sql) 输入参数:BoardPNCode ‘BTP’ 结果正确(得到了相应的记录)
输入参数:BoardPNCode BTP 提示:列名 'BTP' 无效。(程序把BTP当做列名了,数据库中确实没有这个字段)我在C#程序中用两个string 变量传入参数,同样提示:列名‘BTP'无效C# 程序是这样:
public string[] InquriyCode(string tableName,string boardType)
{
int i = 0;
string[] tempStr=new string[100];
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("p_CodeInquiry", conn);
boardType = boardType.Trim();
SqlParameter m_paraTableName = new SqlParameter("@tableName", tableName);
SqlParameter m_paraBoardType = new SqlParameter("@boardType", boardType);
da.SelectCommand.Parameters.Add(m_paraTableName);
da.SelectCommand.Parameters.Add(m_paraBoardType);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.Fill(ds);//提示:列名'BTP'无效
//后面的不用管
someFunc.SelecttSort(ref ds);
foreach (DataRow dr in ds.Tables[0].Rows)
{
if (dr["ChangeDate"].ToString() == string.Empty || dr["ChangeDate"].ToString() == null)
{
return tempStr;
}
tempStr[i] = dr["ChangeDate"].ToString();
i++;
}
return null;
}现在问题是:我调试发现,boardType的值为:"BTP",请问我怎样才能传入:'BTP'呢???
那位高手能详细叙述一下:在SQL SERVER 2005 C# 中 ‘ “ + 3个符号意思是什么?
看看tableName和boardType是不是你所传入的值~~![align=center]***********************************************************
欢迎使用CSDN 小秘书
***********************************************************[/align]
两个字符串变量:tableName:"BoardPNCode" boardType:"BTP"(调试的结果)现在问题是:要传入 BoardPNCode 'BTP' 才行,就像在SQL SERVER中输入的那样输入参数:BoardPNCode 'BTP' 结果正确(得到了相应的记录)
输入参数:BoardPNCode BTP 提示:列名 'BTP' 无效。(程序把BTP当做列名了,数据库中确实没有这个字段) 这两次是在SQL SERVER中执行的存储过程那位大侠能解释下?
SELECT * FROM table1 WHERE BoardType=BTP -- 假设你传的表名为table1
这时候SQL语句是这样的,BTP没有双引,而BoardType又为NVARCHAR类型,他就会把BTP当成这个表的字段与BoardType字段去比较比较。
你要把存储过程改成这样试下:
ALTER procedure [dbo].[p_CodeInquiry]
@tableName nvarchar(50),
@boardType nvarchar(50)
as
declare @sql nvarchar(1000)
set @sql='SELECT * FROM '+@tableName+' Where BoardType='''+@boardType+'''
exec(@sql)
SELECT * FROM table1 WHERE BoardType=BTP -- 假设你传的表名为table1这时候SQL语句是这样的,BTP没有双引,而BoardType又为NVARCHAR类型,他就会把BTP当成这个表的字段与BoardType字段去比较比较。
你要把存储过程改成这样试下:
ALTER procedure [dbo].[p_CodeInquiry]
@tableName nvarchar(50),
@boardType nvarchar(50)
as
declare @sql nvarchar(1000)
set @sql='SELECT * FROM '+@tableName+' Where BoardType='''+@boardType+'''
exec(@sql)
ALTER procedure [dbo].[p_Users]
@userName varchar(50),
@passWord varchar(50)
as
select Athority from Users where UserName=@userName and PassWord=@passWord
它怎么不把传入的@userName,@passWord当做列名呢? 百思不得其解
而你执行动态SQL的时候他是先把你传递的参数与SQL语句拼接,然后去执行。也就是在执行的时候SQL语句是这样的:
SELECT * FROM table1 WHERE BoardType=BTP 你可以把
select Athority from Users where UserName=@userName and PassWord=@passWord
这条语句直接这样执行试试:
select Athority from Users where UserName=你传的参数不包含单引 and PassWord=你传的参数不包含单引
这是同样的道理
我知道错误原因。
你的回答解决不了问题
我怎么用C# 传入:BoardPNCode 'BTP'
或者修改存储过程 使C#传入: BoardPNCode BTP 也行................
@tableName nvarchar(50),
@boardType nvarchar(50)
as
declare @sql nvarchar(1000)
set @sql='SELECT * FROM '+@tableName+' Where BoardType='''+@boardType+''''
exec(@sql)
{
int i = 0;
string[] tempStr=new string[100];
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("p_CodeInquiry", conn);
//**************************************//
SqlParameterCollection spc = da.SelectCommand.Parameters;
spc.Add("@tableName", SqlDbType.NVarChar, 50).Value = tableName;
spc.Add("@boardType", SqlDbType.NVarChar, 50).Value = boardType.Trim();
//**************************************//
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.Fill(ds);//提示:列名'BTP'无效
//后面的不用管
someFunc.SelecttSort(ref ds);
foreach (DataRow dr in ds.Tables[0].Rows)
{
if (dr["ChangeDate"].ToString() == string.Empty || dr["ChangeDate"].ToString() == null)
{
return tempStr;
}
tempStr[i] = dr["ChangeDate"].ToString();
i++;
}
return null;
}
{
int i = 0;
string[] tempStr=new string[100];
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("p_CodeInquiry", conn);
//**************************************//
SqlParameterCollection spc = da.SelectCommand.Parameters;
spc.Add("@tableName", SqlDbType.NVarChar, 50).Value = tableName;
spc.Add("@boardType", SqlDbType.NVarChar, 50).Value = boardType.Trim();
//**************************************//
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.Fill(ds);//提示:列名'BTP'无效
//后面的不用管
someFunc.SelecttSort(ref ds);
foreach (DataRow dr in ds.Tables[0].Rows)
{
if (dr["ChangeDate"].ToString() == string.Empty || dr["ChangeDate"].ToString() == null)
{
return tempStr;
}
tempStr[i] = dr["ChangeDate"].ToString();
i++;
}
return null;
}