繁体   English   中英

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

[英]How to insert 1 or 0 in Sql Server for bit type field if checkbox is checked?

我试图在我的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() + "'"
            ) ;

请引导我我做错了什么?

将复选框的名称添加到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. 您的C#代码示例甚至无法编译。
  2. 您构造的容易受到SQL注入攻击的动态sql
  3. 您的SQL insert查询在语法上无效,如果您要编译代码,则会引发错误。

假定已更正这些错误,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 ;
}

通过c#在数据库表中插入位值:

像这样使用sql参数:

SqlParameter =新的SqlParameter(“ @ check1”,Convert.ToBoolean(0))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM