gpt4 book ai didi

c# - sqlce服务器: How to Store a Single Char?

转载 作者:行者123 更新时间:2023-12-02 17:52:17 27 4
gpt4 key购买 nike

我的 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}。

enter image description here

已解决

为了确定 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)。您会注意到 charhttp://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# 语言规范定义了从 charshortushort 的隐式转换,因此比较应该按您的预期进行:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com