插入SQL Server数据库时文本被截断

时间:2014-03-03 15:14:58

标签: c# sql sql-server foxpro sqlcommand

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

以下是列属性页面的屏幕截图:

SQL-Server Management Studio propertypage

以下代码导致问题:

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;
}

有没有人有想法,为什么文本被截断以及我们如何才能使这个工作?

2 个答案:

答案 0 :(得分:1)

您的问题似乎是SQL Server Management Studio中的限制,而不是数据库中的限制。 Here是关于该问题的错误报告,声称该错误已在最新版本中得到修复(我不知道这是否属实)。根据建议here,有一些解决方法。我没有亲自尝试过。

您应该使用len()函数(或类似的东西)测试长度。这将告诉您是否所有数据都存在。

我在数据库中使用了很长的字符串,在表,变量和存储过程之间来回传递它们,因此数据库可以处理字符串。问题在于获取它们的界面。

答案 1 :(得分:0)

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

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