簡體   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