C# boolean 需要转换为 SQL Server 的位,因此它需要为 1 而不是 True
Posted
技术标签:
【中文标题】C# boolean 需要转换为 SQL Server 的位,因此它需要为 1 而不是 True【英文标题】:C# boolean needs converted to bit for SQL Server so instead of True it needs to be 1 【发布时间】:2015-12-13 23:09:14 【问题描述】:我有一个数据类型为bool
的C# 属性,当它被设置时,它变成True
或False
。
但是我需要它与bit
类型的 SQL Server 表列匹配,以便将其保存为 1 或 0。
SQL Server 列:
StormOut bit
C# 属性
public bool StormOut get; set;
C# SQL 语句:
string querystring = "UPDATE tblSignOnOff SET StormOut = " + storm.StormOut + " WHERE id = 1902";
否则目前C#中的SQL语句是
UPDATE tblSignOnOff
SET StormOut = True
WHERE id = 1902
这会导致错误:
列名“True”无效。
【问题讨论】:
您可以尝试Parameters.AddWithValue
进行参数化查询,这可能对您有所帮助
【参考方案1】:
您错过了单引号。改成这样:
string querystring = "UPDATE tblSignOnOff SET StormOut = '" + storm.StormOut + "' WHERE id = 1902";
但重要提示:您应该始终使用parameterized queries
,如下所示。这种字符串连接对SQL Injection
开放:
string querystring = "UPDATE tblSignOnOff SET StormOut = @StormOut WHERE id = @id";
yourCommand.Parameters.AddWithValue("@id", 1902);
yourCommand.Parameters.AddWithValue("@StormOut", storm.StormOut);
【讨论】:
好吧,我想我将不得不做“Convert.ToInt16 你的布尔值。这将使真/假,0 或 1” 是的:“使用参数化查询”!永远不要通过简单地连接字符串/值来构建 sql 语句。【参考方案2】:你应该使用参数并避免字符串连接
string Command = "UPDATE tblSignOnOff SET StormOut @StormOut WHERE id = @id";
using (SqlConnection mConnection = new SqlConnection(ConnectionString))
mConnection.Open();
using (SqlCommand myCmd = new SqlCommand(Command, mConnection))
myCmd.Parameters.AddWithValue("@id", 1902); // TODO set this value dynamically
myCmd.Parameters.AddWithValue("@StormOut", storm.StormOut);
int RowsAffected = myCmd.ExecuteNonQuery();
【讨论】:
Add 和 AddWithValue 有什么区别? 我个人会避免AddWithValue
,直接指定类型并使用Value
属性,但这至少比原始代码更好......
***.com/questions/21110001/…
@JonSkeet 我不关注你。使用价值属性?例子?
@Byyo:它避免使用你不想要的推论。例如,请参阅blogs.msmvps.com/jcoehoorn/blog/2014/05/12/…。【参考方案3】:
根据@S.Akbari 对参数化查询的建议进一步修改了答案;
SqlCommand command = new SqlCommand();
command.CommandText = "UPDATE tblSignOnOff SET StormOut = @StormOut WHERE id = @id";
command.Parameters.AddWithValue("@StormOut", storm.StormOut);
command.Parameters.AddWithValue("@id", 1902);
【讨论】:
那是粗鲁的复制和粘贴 @Byyo 如果你真的认为我复制粘贴你的答案,告诉我,我会删除我的..以上是关于C# boolean 需要转换为 SQL Server 的位,因此它需要为 1 而不是 True的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中将十六进制值从 SQL Server 转换为日期时间