c#读取SQL表(带特殊字符)到数据集

本文关键字:特殊字符 数据集 读取 SQL | 更新日期: 2023-09-27 17:52:44

我有一个问题从SQL数据表中读取特殊字符并加载到c#中的数据表中。我目前使用SqlDataAdapter来填充我的表:

using (oSQLConnection = new SqlConnection(oDBConnection.ConnectionString))
{
    oSQLConnection.Open();
    using (oSQLDataAdapter = new SqlDataAdapter(sQuery, oSQLConnection))
    {
        oSQLDataAdapter.SelectCommand.CommandTimeout = 0;
        oSQLDataAdapter.Fill(DataSource, sTableName);
    }
}

但是对于特殊字符,如Sam’s,这不能很好地工作,注意引号,这不是一个正常的引号。此外,像rest – now这样的字符不是一个正常的连字符(-它是一个em连字符),对于这个例子,字符将在数据集中显示为rest ¿ now。其中一个成员说尝试使用SqlDataReader,但是DataSet没有加载函数(只有DataTable) -你们有其他建议吗?

我发现这些结果是这样出来的,如果我在这个方法被调用后在代码中放置一个断点。在数据集中,它将显示为rest now,如果我要将此数据集导出为csv文件,它将与rest ¿ now一起脱落。我的猜测是该字符在数据集中不受支持,因此它转换为数据集支持的另一个字符。

SQL Column datattype = nvarchar

谢谢。

编辑:好了,伙计们,我知道为什么这些字符不匹配了。这是因为我们用em破折号或特殊引号将DATA加载到Oracle中。然而,Oracle不支持这些字符,所以他们将字符切换为支持颠倒问号的另一个字符。我相信这是因为Oracle是在UTF8和我们检索数据在SQL(即。在SQL中做字符串匹配)因为SQL有变量来作为颠倒的问号,它们不匹配。

我有一个问题要问你们。当我们在Oracle - EM中加载这些特殊字符时,破折号和特殊引号。有可能保持角色不变吗?所以在SQL中检索时,结果是

谢谢。

c#读取SQL表(带特殊字符)到数据集

这是一个可能的解决方案,但它未经测试,所以记住这一点!

我遇到了一个类似的问题前一段时间在Oracle的特殊字符。我们的字符集是UTF-16。有一些奇怪的东西,比如在正常的32-127范围之外的变音符和其他ascii字符。

你可以尝试的一件事是首先做一个HTML编码到该范围之外的任何东西,加载到你的数据表在c#中,然后作为数据表填充(或之后它被填充…),执行一个HTML解码对这些字段。

我们有一个html编码函数为我们做这些,像这样:

  FUNCTION HTML_Encode_Special_Characters
   (p_string IN VARCHAR2,
    p_do_encode IN VARCHAR2 DEFAULT 'Y')
  RETURN VARCHAR2 IS
    first_location number := REGEXP_INSTR(p_string, '([^' || CHR(1) || '-' || CHR(127) || '])');
    v_string VARCHAR2(32000);
    v_char VARCHAR2(1 char);
    v_ascii_number number;
  BEGIN
    IF p_do_encode = 'Y' AND first_location > 0 THEN
      v_string := p_string;
      FOR i IN first_location .. length(v_string) LOOP
        v_char := substr(v_string,i,1);
        v_ascii_number := ascii(v_char);
        IF v_ascii_number > 128 THEN
          -- just replace all of them
          v_string := REPLACE (v_string, v_char,'&#' || v_ascii_number || ';');
        END IF;
      END LOOP;
      RETURN (v_string);
    ELSE
      RETURN p_string;
    END IF;
  END;

这将加载"string"数据到你的表中如果你有特殊字符,它会显示为'½'或者类似的东西

然后在c#端你可以做一些html解码:

using System.Web;
HttpUtility.HtmlDecode(mystring);

再次…未测试。但它应该非常容易实现和测试和/或稍微调整它以使其工作。

另一种解决方案是简单地在数据库上执行数据修复,将所有这些特殊字符更改为"常规"表示(即,将-破折号更改为普通破折号)。您可以使用一些正则表达式,使用CHR()函数,并使用DUMP()函数查看奇数数据。