我的 Microsoft SQL CE 3.5 SP2 数据库中有一个名为 Type 的列,需要存储一个字符。
为此,我将列格式化为nchar(1)
,并且存储数据工作正常。
但是,每当我尝试使用 Visual Studio 2010 填充DataTable
时, Type 列值将存储为 string 值。
每当我尝试使用我们的公司方法之一来测试给定数据行是否已更改时,这实际上只会造成严重破坏。存储在内存中的值(字符)从不等于从数据库读回的值(因为它是不同的数据类型)。
我应该分配一个不同的 SQL 数据类型,而不是编写一个特殊的例程来测试每一列以查看它是否为char
数据类型并进行转换。表的列?
可用列的列表似乎是{bigint,binary,bit,datetime,float,image,int,money,nchar,ntext,numeric,nvarchar,real,rowversion,smallint,tinyint,uniqueidentifier,varbinary}。< / p>
解决
为了确定我的In Memory
数据是否已从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;
}
随意批评我的代码中的任何内容。我讨厌听到我不做最好的事情,但它总是刺激我的能力增长。
答案 0 :(得分:2)
SQL没有char
数据类型。它只包含字符串 - char(n)
,varchar(n)
,nchar(n)
和nvarchar(n)
。您会注意到char
在http://msdn.microsoft.com/en-us/library/cc716729.aspx
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] ;
是显而易见的
如果您使用的是SqlDataReader,则可以通过SQLDataReader的GetChars()
方法将char值作为字符数组检索:
smallint
这可能就像你要去的那样接近。另一种方法是将您的单个字符存储为char
。 C#语言规范定义了从short
到ushort
或public bool Test( char value , short expected )
{
return ( value == expected ) ;
}
的隐式转换,因此比较应该按预期工作:
{{1}}
答案 1 :(得分:1)
这很常见。我所知道的数据库没有单字符类型,只有长度为1的字符串。
将char转换为字符串或将其与fieldValue [0]进行比较不应该是一个问题。
另一种方法是将您的类型存储为SmallInt值(可能映射到枚举)。
答案 2 :(得分:1)
我认为你不能绕过NCHAR转换为String。
您可以向转换它的模型添加属性,例如
public char CharStatus { get { return status[0]; } }
有意义吗?!
答案 3 :(得分:1)
您总是可以根据Nicholas上面提供的代码创建一个帮助方法。您只需将当前数据读取器对象作为参数传递,然后传递要查询的列。
char isOkToEmailPromos = GetAChar(reader, 9); // Calling method
private char GetAChar(SqlDataReader rd, int column)
{
char[] value = new char[1];
long charCount = (long)rd.GetChars(column, 0, value, 0, value.Length);
if (charCount != value.Length) throw new InvalidOperationException();
return value[0];
}