我怎样才能在一个VARCHAR(MAX)列具有的ExecuteNonQuery插入超过8000个字符

2019-07-18 06:55发布

我想通过插入> 8000个字符(从网页提交) ExecuteNonQuery (和DatabaseFactory.CreateDatabase()从MS实践企业库)。 存储过程定义了参数作为VARCHAR(MAX) 该柱是VARCHAR(MAX) 从理论上说,2GB的数据应该能够通过。

我能做些什么来传递数据> 8000? 我设置一个断点和string.Length的确> 8K。

   public static void UpdateTerms(string terms)
   {
        Database db = DatabaseFactory.CreateDatabase();
        db.ExecuteNonQuery("uspUpdateTerms", terms);
    }

存储过程:

ALTER PROCEDURE [dbo].[uspUpdateTerms]
    @Terms VARCHAR(MAX)
AS
  SET NOCOUNT ON

  INSERT INTO tblTerms(Terms)
  VALUES(@Terms)

表(只是为了显示这一切都是varchar(max) ):

CREATE TABLE [dbo].[tblTerms](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Terms] [varchar](max) NULL,
[DateUpdated] [datetime] NULL,

更新:

我只是改变了代码,这似乎工作,虽然我不知道有什么区别:

 public static void UpdateTerms(string terms)
 {
        Database db = DatabaseFactory.CreateDatabase();
        DbCommand cmd = db.GetStoredProcCommand("uspUpdateTerms");
        db.AddInParameter(cmd, "Terms", DbType.String, terms);
        db.ExecuteNonQuery(cmd);
 }

Answer 1:

这个问题可能不是数据的存储,它可能是检索。

如果你正试图确定超过8000个字符是否是通过Enterprise Manager存储在数据库中,那么你的运气了,如果你只是选择了列的内容,并期待在文字长度:企业经理限制列输出。

要确定实际有多少数据存储在列,执行以下查询:

SELECT DATALENGTH(Terms) FROM tblTerms

这会告诉你多少文本的存储方式。

编辑:

另一种认为刚刚发生:存储起来,以便提高性能过程的参数企业库高速缓存。 如果你设置的参数测试后更改了存储过程nvarchar(8000)然后切换参数nvarchar(max) ,无需重新设置应用程序(如IIS托管,然后iisreset或肮脏web.config ),那么你仍然会是使用旧的存储过程的参数。



Answer 2:

REPLICATE不管以后分配的返回输入类型。 这很烦人,但要避免沉默截断,请尝试:

SET @x = REPLICATE(CONVERT(VARCHAR(MAX), 'a'), 10000);

这是因为SQL Server执行REPLICATE它认为你将其分配给或者你想有多少个字符将其扩展到什么之前操作。 它只关心输入表达式来确定它应该返回什么,如果输入的是不是一个最大的类型,它假定它是为了配合在8000个字节。 这在解释联机丛书 :

如果string_expression的类型为varchar(最大)或nvarchar(最大)不,请复制截断在8000个字节的返回值。 要返回值大于8000个字节,string_expression必须明确地转换为相应的大值数据类型。



Answer 3:

示例代码可以是固定做:

declare @x varchar(max)
set @x = replicate (cast('a' as varchar(max)), 10000)
select @x, len(@x)


Answer 4:

您还没有表现出,你要使用的代码ExecutenonQuery 。 请注意,您应该使用的参数。

using(var con = new SqlConnection(conString))
using(var cmd = new SqlCommand("storedProcedureName", con))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@text", SqlDbType.NVarChar, -1);
    cmd.Parameters["@text"].Value = yourVeryLongText;
    cmd.ExecuteNonQuery();
}


文章来源: How can I insert more than 8000 characters in a VARCHAR(MAX) column with ExecuteNonQuery?