2

我试图通过ExecuteNonQuery(和MS Practices Enterprise Library中的DatabaseFactory.CreateDatabase())插入> 8000个字符(从网页提交)。存储过程将参数定义为VARCHAR(MAX)。该栏目为VARCHAR(MAX)。理论上,2GB的数据应该可以通过。如何使用ExecuteNonQuery在VARCHAR(MAX)列中插入多于8000个字符?

我能做些什么来传递数据> 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); 
} 
+0

有趣的是,如果我做的:插入测试 (数据) 值 (@x + @x + @x) 选择数据,从测试莱恩(数据)......它显示了24000(不30K),但显然允许> 8K –

+0

@twoleggedhorse - 'a'被视为'varchar(1)'不是'nvarchar(8000)'(甚至没有这样的数据类型) –

+0

我的意思是说VARCHAR不是NVARCHAR,我已转贴我的评论,因为我不能再编辑它 – twoleggedhorse

回答

2

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

如果您试图确定是否通过企业管理器将超过8000个字符存储在数据库中,那么如果您只是选择列的内容并查看文本长度,那么您运气不佳:企业管理器限制列输出。

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

SELECT DATALENGTH(Terms) FROM tblTerms 

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

编辑:

另一种认为刚刚发生:存储起来,以便提高性能过程的参数企业库高速缓存。如果在参数设置为nvarchar(8000)后进行测试后更改了存储过程,则在不重置应用程序的情况下将参数切换为nvarchar(max)(如果由IIS托管,则为iisreset或脏web.config),那么您仍将使用旧存储的proc参数。

+0

可能是这样。 SP是VARCHAR(8000),我改变了它。我把代码放回原来的样子,而且它也可以工作。 –

+0

它必须被缓存。你钉了它!真棒。 –

3

REPLICATE不论返回输入型以后的任务。这很烦人,但要避免沉默截断,尝试:

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

这是因为SQL Server它认为你将其分配给或者你想有多少个字符将它扩大到什么之前执行REPLICATE操作。它只关心输入表达式以确定它应该返回的内容,如果输入不是最大类型,则它假定它适合8,000字节。这在Books Online解释说:

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

+0

这个测试我理解,但最终我该如何完成我正在尝试做的事情,这是使用ExecuteNonQuery从C#程序传递> 8K? –

+0

@ Investor5555我不知道有任何问题从C#发送更大的查询(尽管如果您的查询文本长度超过8K,也许您应该考虑存储过程,参数化查询,表值参数等)。也许你的问题应该说明这个问题,而不是我们已经回答的问题? –

2

示例代码可以是固定做:

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

您还没有表现出,你要使用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(); 
} 
+0

这完全是一个SQL问题 - 默认情况下,未定义的字符串类型被视为NVARCHAR(8000)。 – twoleggedhorse

+1

@twoleggedhorse没有'NVARCHAR(8000)'这样的东西。 –

+0

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

相关问题