【问题标题】:Text is being truncated on Insert into SQL Server database插入 SQL Server 数据库时文本被截断
【发布时间】:2014-03-03 15:14:57
【问题描述】:

我们在使用SqlCommand 将数据插入 SQL Server 数据库时遇到了一个奇怪的问题。如果我们尝试在konnotiz1 列中插入一个大文本,则文本会在 43245 个字符后被截断。出于某种原因,我不明白真正的应用程序代码会创建 42909 个字符。

这是列属性页面的截图:

以下代码导致问题:

static void Test()
{
    using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(getConString()))
    {
        con.Open();
        System.Data.SqlClient.SqlCommand cmd = con.CreateCommand();
        cmd.CommandText = "Insert into kontakte (konlfdnr, konNotiz1) values (@konlfdnr, @konNotiz1)";
        cmd.CommandType = CommandType.Text;
        cmd.CommandTimeout = 60;

        // you can ignore this param, it's owner pk-column. 
        System.Data.SqlClient.SqlParameter param = cmd.Parameters.Add("@konlfdnr", SqlDbType.Char, 10);

        // better don't ask why we have to pad this... ;) 
        param.Value = "1".PadLeft(10);
        param.Direction = ParameterDirection.Input;

        param = cmd.Parameters.Add("@konNotiz1", SqlDbType.Text);
        param.Direction = ParameterDirection.Input;
        param.Value = getParamValue();

        cmd.ExecuteNonQuery();
        con.Close();
    }
}

private static string getParamValue()
{
     // my Textfile has something about 300000 characters. It's a html code from a mail.
     return System.IO.File.ReadAllText("C:\\Temp\\insert.txt");
}

private static string getConString()
{ 
    return @"Data Source=NB-JH1\SQLEXPRESS;Initial Catalog=Testsystem_Local;Integrated Security=True;Encrypt=True;TrustServerCertificate=True;Pooling=True;MultipleActiveResultSets=True;
}

有没有人知道为什么文本被截断以及我们如何让它工作?

【问题讨论】:

  • 这个article会更好地启发你。
  • 您是否在参数上指定了尺寸?文本最多可容纳 2.1G 字节
  • 数据加载后如何测量长度?
  • param = cmd.Parameters.Add("@konNotiz1", SqlDbType.VarChar, -1);
  • 从文件中读入多长的数据?在你责备之前,你实际上是在将所有数据都发送到 SQL Server 中吗……

标签: c# sql sql-server foxpro sqlcommand


【解决方案1】:

您的问题似乎是 SQL Server Management Studio 中的限制,而不是数据库中的限制。 Here 是关于该问题的错误报告,声称该错误已在最新版本中修复(我不知道这是不是真的)。正如here 建议的那样,有一些变通方法。我没有亲自尝试过。

您应该使用len() 函数(或类似函数)来测试长度。这会让您知道所有数据是否都在那里。

我在数据库中处理过很长的字符串,在表、变量和存储过程之间来回传递它们,以便数据库可以处理这些字符串。问题在于获取它们的接口。

【讨论】:

  • 如果我通过代码读取数据,结果不会改变。所以这不是managemend Studio的限制。但是谢谢。供您参考。
【解决方案2】:

首先,Text 是一种过时的 sql 数据类型。请改用 varchar(max)。 我会尝试更改字段的类型和参数的类型。

这肯定不能解决问题 - 但它是消除问题的好方法(这是导致问题的原因),也是一种很好的做法(不要使用已弃用的功能)

【讨论】:

  • 1) 文本已弃用,但并未过时 - 它仍受支持,2) 由于它们是等效的,因此可能无法解决问题。
  • 1.公认。 2. 它们在功能上是等价的,但在实现上是等价的——因此,将类型更改为未弃用的类型是一个很好的建议,也许(不确定)它甚至可以解决问题......我应该写那个。 . 但是忘了,因为我是用手机写的。
  • 不幸的是我无法更改数据类型。它已经使用多年,并已运送给许多客户。我们软件的某些部分是用 VisualFoxPro 编写的,也许这就是他们决定使用这种类型的原因。
  • 我刚读到一些让我思考的东西……你怎么知道文本被截断了?
  • @ShlomiBorovitz 我通过代码或使用 SQL-Managemend Studio 选择列,并将其与我用于插入的原始值进行比较。
猜你喜欢
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
相关资源
最近更新 更多