【问题标题】:String or binary data would be truncated in Varbinary(MAX)字符串或二进制数据将在 Varbinary(MAX) 中被截断
【发布时间】:2016-05-24 11:50:08
【问题描述】:

我在 sql server 2008 中创建了一个表,其中一个列的数据类型为 varbinary(MAX)。使用 C# 代码我尝试插入一个 pdf 文件(18000 字节),但它给出错误“字符串或二进制数据会被截断"

我经历了很多线程,答案是因为列大小小于数据大小。但是 Varbinary(MAX) 的最大大小是 2GB。我需要帮助

CREATE TABLE [dbo].[Purchase_Order] (
[PO_Number]           VARCHAR (25)    NOT NULL,
[Organization_Name]   VARCHAR (10)    NOT NULL,
[PO_Date]             DATE            NOT NULL,
[Value_Amount]        NUMERIC(8, 2)  NOT NULL,
[Currency_Type]       NVARCHAR (10)   NOT NULL,
[Customer_Name]       VARCHAR (50)    NOT NULL,
[Contact_Person]      VARCHAR (50)    NOT NULL,
[Customer_Location]   VARCHAR (20)    NOT NULL,
[End_Date]            DATE            NOT NULL,
[Emug_Contact_Person] VARCHAR (50)    NOT NULL,
[Payment_Terms]       NUMERIC (3)     NOT NULL,
[Project_Type]        NCHAR (10)      NOT NULL,
[File_Name]                VARBINARY (MAX) NOT NULL,
CHECK ([PO_Number]<>''),
CHECK ([Organization_Name]<>''),
CHECK ([PO_Date]<>''),
CHECK ([Value_Amount]<>(0)),
CHECK ([Currency_Type]<>''),
CHECK ([Customer_Name]<>''),
CHECK ([Contact_Person]<>''),
CHECK ([Customer_Location]<>''),
CHECK ([End_Date]<>''),
CHECK ([Emug_Contact_Person]<>''),
CHECK ([Payment_Terms]<>''),
CHECK ([Project_Type]<>''),

);

这是我的插入代码

public int Insertcommand(string tablename, string[] columlist, object[] valuelist)
    {
        int x = 0;
        string commandstring = createcommand(tablename, columlist);
        MyCommand = new SqlCommand(commandstring, GetConnection());

        for (int i = 0; i < valuelist.Count(); i++)
        {
            MyCommand.Parameters.AddWithValue("@" + columlist[i].ToLower(), valuelist[i]);
        }

        x = MyCommand.ExecuteNonQuery();

        return x;
    }

variable names

我的命令字符串

qry = "INSERT into Purchase_Order (PO_Number, Organization_Name, PO_Date, Value_Amount, Currency_Type, Customer_Name, Contact_Person, Customer_Location, End_Date, Emug_Contact_Person, Payment_Terms, Project_Type, File_Name) VALUES (@po_number, @organization_name, @po_date, @value_amount, @currency_type, @customer_name, @contact_person, @customer_location, @end_date, @emug_contact_person, @payment_terms, @project_type, @file_name)"

【问题讨论】:

  • 你能显示表定义和你的SQL语句吗?
  • @PatrickHofman 我添加了表定义
  • 文件名为什么会比较多,如果只是个名字不应该是VARCHAR(MAX)
  • 您确定是File_Name 列有截断问题吗?请向我们展示您产生错误的代码。
  • Onsite-Domestic 是项目类型吗?如果是,则由于其长度而发生此错误NCHAR(10)

标签: c# sql sql-server


【解决方案1】:

这里的问题是Project_Type 字段。这里是数据类型长度和实际值的比较:

INSERT into dbo.Purchase_Order
( PO_Number -- 25
, Organization_Name -- 10
, PO_Date
, Value_Amount
, Currency_Type -- 10
, Customer_Name -- 50
, Contact_Person  -- 50
, Customer_Location  -- 20
, End_Date
, Emug_Contact_Person -- 50
, Payment_Terms
, Project_Type -- 10 <--- BAD STUFF
, File_Name -- MAX
)
VALUES
( @po_number -- 10
, @organization_name -- 3
, @po_date
, @value_amount
, @currency_type -- 5
, @customer_name -- 2
, @contact_person -- 3
, @customer_location -- 2
, @end_date
, @emug_contact_person -- 3
, @payment_terms
, @project_type -- 15 <--- BAD STUFF
, @file_name
)

您会看到Project_Type 只允许 10 个字符,但实际值 (ONSITE-DOMESTIC) 是 15 个字符长。

【讨论】:

  • @patrick....非常感谢....我增加了列的大小..但我面临新问题“将数据类型 varchar 转换为数字时出错”。你觉得其他专栏有什么问题吗...
  • 不是一个明确的问题。尝试自己消除字段。创建一个允许空值的表,并一一尝试每一列。
  • 在不指定小数时是否有理由使用 NUMERIC 而不是 INT?
  • @PatrickHofman 由于检查约束而导致的错误...我为数字字段提供了字符串值..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多