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

Omi*_*Omi 0 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() + "'"
            ) ;
Run Code Online (Sandbox Code Playgroud)

请指导我在哪里做错了?

Ste*_*eve 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()+"'");
Run Code Online (Sandbox Code Playgroud)

但是串联的问题很严重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();
     }
 }
Run Code Online (Sandbox Code Playgroud)

并称之为

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);
Run Code Online (Sandbox Code Playgroud)

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