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

标签 c# .net sql sql-server-ce

我的 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/

相关文章:

c# - 帮助在线程上执行带参数的方法

c# - C# WPF 项目中 Resources 文件夹中的 XML 文件到 FileStream 的路径

java - 可以使用类接口(interface)代替 AOP 来实现关注点分离吗?

mysql - 使用MySQL处理大型数据集

c# - 列出不同类型

c# - LINQ To Entities 以及如何使这个简单的查询工作

c# - 使用 Linq To SQL 加盐和散列密码

.net - BouncyCaSTLe包使用.NET Framework版本恢复,但在Linux上运行良好

javascript - 表的每一行上的提交按钮,将该行的数据插入数据库

sql - 在同一 SQL 查询中选择最大值和最小值