存储过程:
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个符号意思是什么?

解决方案 »

  1.   

    你调试下那两个参数有问题么?
    看看tableName和boardType是不是你所传入的值~~![align=center]***********************************************************
                       欢迎使用CSDN 小秘书
    ***********************************************************[/align]
      

  2.   

    2楼,我已经说的很清楚了
    两个字符串变量:tableName:"BoardPNCode"    boardType:"BTP"(调试的结果)现在问题是:要传入   BoardPNCode  'BTP'  才行,就像在SQL SERVER中输入的那样输入参数:BoardPNCode 'BTP' 结果正确(得到了相应的记录)
    输入参数:BoardPNCode BTP 提示:列名 'BTP' 无效。(程序把BTP当做列名了,数据库中确实没有这个字段)  这两次是在SQL SERVER中执行的存储过程那位大侠能解释下?
      

  3.   

    当然啦,你直接传入BTP进去,那个变量@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)
      

  4.   

    当然啦,你直接传入BTP进去,那个变量@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)
      

  5.   

    楼上的,还是不行
    ALTER procedure [dbo].[p_Users]
    @userName varchar(50),
    @passWord varchar(50)
    as
    select Athority from Users where UserName=@userName and PassWord=@passWord
    它怎么不把传入的@userName,@passWord当做列名呢? 百思不得其解
      

  6.   

    原因也很简单,因为你这里是执行存储过程,在声明参数的时候已经规定@userName为varchar(50),
    而你执行动态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=你传的参数不包含单引
    这是同样的道理
      

  7.   

    ZXY900213
    我知道错误原因。
    你的回答解决不了问题
    我怎么用C# 传入:BoardPNCode  'BTP'
    或者修改存储过程 使C#传入: BoardPNCode  BTP  也行................
      

  8.   

    修改存储过程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)
      

  9.   

    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);
      
               //**************************************//
                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;
      }
      

  10.   

    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);
       
      //**************************************//
      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;
      }