如果选中复选框,如何在Sql Server中为位类型字段插入1或0?

时间:2014-03-03 19:25:38

标签: c# sql-server checkbox bit

我试图在我的SQL Server数据库中插入1或0,我的数据类型是“位”。 我已经尝试过这样做,但它说错误的语法靠近哪里 -

dt=g1.ExecDB( insert into tbl ("check1,check2,check3") values('"
            + Convert.ToByte(check1.Checked) + "','"
            + Convert.ToByte(check2.Checked) + "','"
            + Convert.ToByte(check3.Checked) + "' ) )
              where loginname = '"+Session["log"].ToString() + "'"
            ) ;

请指导我在哪里做错了?

3 个答案:

答案 0 :(得分:5)

在sql字符串中添加复选框的名称不起作用,当然也没有在它们上调用Convert.ToByte。通过这种方式,您可以在字符串中简单地插入控件的名称以及应该转换其值的函数的名称。但是,这当然只是数据库的sql解析器的无效SQL命令。

相反,您应该尝试解决从C#代码创建有效SQL命令的问题。这是您的问题的初步可能解决方案

dt=g1.ExecDB("insert into tbl (check1,check2,check3) values(" + 
             (check1.Checked ? "1" : "0") + ", " + 
             (check2.Checked ? "1" : "0") + ", " + 
             (check3.Checked ? "1" : "0") + 
             ") where loginname='"+Session["log"].ToString()+"'");

但是Session["log"]的连接存在很大问题。 连接字符串值(可能由用户输入设置)以形成sql命令是一种非常糟糕的做法,因为它容易受到Sql Injection的攻击。因此,必须更改ExecDB以接收参数列表。

我建议将ExecDB改为这样的

public int ExecDB(string query, List<SqlParameter>parameters = null)
{
     using(SqlConnection cn = new SqlConnection(connString))
     using(SqlCommand cmd = new SqlCommand(query, cn))
     {
         cn.Open();
         if(parameters != null && parameters.Count > 0)
             cmd.Parameters.AddRange(parameters.ToArray());
         return cmd.ExecuteNonQuery();
     }
 }

并用

调用它
List<SqlParameter> ps = new List<SqlParameter>();
SqlParameter p = new SqlParameter("@login", Session["log"].ToString());
ps.Add(p);
dt=g1.ExecDB("insert into tbl (check1,check2,check3) values(" + 
             (check1.Checked ? "1" : "0") + ", " + 
             (check2.Checked ? "1" : "0") + ", " + 
             (check3.Checked ? "1" : "0") + 
             ") where loginname=@login", ps);

传递给ExecDB的List<SqlParameter>参数是可选的,因此,如果您有任何代码,其中对ExecDB的调用不需要参数集合,您可以保留现在的代码。

答案 1 :(得分:1)

让我们看看:

  1. 您的C#代码示例甚至无法编译。
  2. 构建易受SQL注入攻击影响的动态SQL
  3. 您的SQL insert查询语法无效,如果您的代码需要编译,则会抛出错误。
  4. 假设这些已得到纠正,CLR将SQL Server的bit数据类型映射到/ bool(又名System.Boolean)。所以......

    尝试这样的事情:

    const string @insertQuery = @"
      insert tbl ( check1 , check2 , check3 )
      select @p1 , @p2 , @p3
      where loginname = @login
      " ;
    
    using ( SqlConnection conn = GetSqlConnection() )
    using ( SqlCommand cmd = conn.CreateCommand() )
    {
    
      cmd.CommandText = insertQuery ;
      cmd.CommandType = CommandType.Text;
      cmd.Parameters.AddWithValue( "@p1"    , check1.Checked ) ;
      cmd.Parameters.AddWithValue( "@p2"    , check2.Checked ) ;
      cmd.Parameters.AddWithValue( "@p3"    , check2.Checked ) ;
      cmd.Parameters.AddWithValue( "@login" , (string) Session["log"] ) ;
    
      conn.Open();
      int rowsAffected = cmd.ExecuteNonQuery() ;
      conn.Close() ;
    
      bool success ;
      if      ( rowsAffected == 0 ) success = false ;
      else if ( rowsAffected == 1 ) success = true ;
      else throw new InvalidOperationException() ;
    
      return success ;
    }
    

答案 2 :(得分:0)

从c#:

在数据库表中插入位值

使用sql参数,如下所示:

SqlParameter = new SqlParameter(&#34; @ check1&#34;,Convert.ToBoolean(0))