- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Microsoft SQL CE 3.5 SP2 数据库中有一个名为 Type 的列,需要存储单个字符。
为此,我已将列格式化为 nchar(1)
,并且存储数据工作正常。
但是,每当我尝试使用 Visual Studio 2010 填充 DataTable
时,Type 列值都会存储为 string 值。
每当我尝试使用我们公司的一种方法来测试给定的数据行是否已更改时,这实际上只会造成严重破坏。存储在内存中的值(一个字符)永远不等于从数据库读回的值(因为它是不同的数据类型)。
与其编写一个特殊的例程来测试每一列以查看它是否为 char
数据类型并进行转换,是否应该有不同的 SQL 数据类型分配给表的列?
可用列的列表似乎为 {bigint、binary、bit、datetime、float、image、int、money、nchar、ntext、numeric、nvarchar、real、rowversion、smallint、tinyint、uniqueidentifier、varbinary}。
已解决
为了确定 SQL CE 表中的内存
数据是否已更改,我使用了以下例程:
// Class RowData
// private List<CellData> cellList;
public bool Changed(DataTable table) {
int index = RowIndex(table);
if (-1 < index) {
DataRow row = table.Rows[index];
foreach (DataColumn col in table.Columns) {
if (!String.IsNullOrEmpty(col.ColumnName)) {
bool found = false;
foreach (var cell in cellList) {
if (cell.ColumnName == col.ColumnName) {
object o = row[cell.ColumnName];
if (col.DataType != typeof(string)) {
if (!cell.Value.Equals(o)) {
return true; // this fails on a Char.value 'C' != "C"
}
} else if (col.MaxLength != 1) {
if (!cell.Value.Equals(o)) {
return true; // this fails on a Char.value 'C' != "C"
}
} else {
string str = o.ToString();
if (!cell.Value.Equals(str[0])) {
return true;
}
}
found = true;
}
if (found) {
break;
}
}
}
}
return false;
}
return true;
}
请随意批评我的代码中的任何内容。我讨厌听到我没有以最好的方式做某事,但这总是会刺激我能力的成长。
最佳答案
SQL 没有 char
数据类型。它只有字符串 - char(n)
、varchar(n)
、nchar(n)
和 nvarchar(n)
。您会注意到 char
在 http://msdn.microsoft.com/en-us/library/cc716729.aspx 处的转换图表中缺失,因此很显眼。
如果您使用的是 SqlDataReader,则可以通过 SQLDataReader 的 GetChars()
以字符数组形式检索 char 值。方法:
SqlDataReader sdr = ...
...
int ordinalColumnNumber = 3 ;
char[] buffer = new char[1] ;
int charCount = sdr.GetChars( ordinalColumnNumber , 0 , buffer , 0 , buffer.Length ) ;
if ( charCount != buffer.Length ) throw new InvalidOperationException() ;
char value = buffer[0] ;
这可能是您所能得到的最接近的结果。另一种方法是将单个字符存储为 smallint
。 C# 语言规范定义了从 char
到 short
或 ushort
的隐式转换,因此比较应该按您的预期进行:
public bool Test( char value , short expected )
{
return ( value == expected ) ;
}
关于c# - sqlce服务器: How to Store a Single Char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686149/
我是一名优秀的程序员,十分优秀!