2011-12-13 34 views
3

我需要一些TEXT列在SQL Server 2008中表执行INSERT秒,我不能为TEXT列工作的ADODB.Command参数。添加文本参数ADODB.Command不使用存储过程

表定义为:

CREATE TABLE dbo.Test (
    TestId INT NOT NULL IDENTITY(1, 1) 
    , CreationDate DATETIME NOT NULL 
    , Value TEXT NOT NULL 
    , CONSTRAINT pkTest PRIMARY KEY (TestId) 
) 

测试页是这样的:

<!-- METADATA TYPE="typelib" NAME="Microsoft ActiveX Data Objects 2.8 Library" UUID="{2A75196C-D9EB-4129-B803-931327F72D5C}" VERSION="2.8" --> 
<%@ CODEPAGE = 65001 LCID = 1040 %> 
<% 
    Option Explicit 
    Response.Clear 
    Response.CharSet = "UTF-8" 
    Response.CodePage = 65001 
    Response.ContentType = "text/plain" 
    Dim i : i = 0 
    Dim value : value = "" 
    For i = 1 To 10000 
     If i Mod 3 = 0 Then 
      value = value & "a " 
     Else 
      value = value & "a" 
     End If 
    Next 
    Dim connection : Set connection = Server.CreateObject("ADODB.Connection") 
    connection.CommandTimeout = 5 
    connection.ConnectionString = "Server=XXX; Database=XXX; Uid=XXX; Pwd=XXX;" 
    connection.ConnectionTimeout = 5 
    connection.IsolationLevel = adXactReadUncommitted 
    connection.Mode = adModeRead 
    connection.Provider = "SQLOLEDB" 
    connection.Open 
    Dim command : Set command = Server.CreateObject("ADODB.Command") 
    command.ActiveConnection = connection 
    command.CommandText = "insert into dbo.Test (CreationDate, Value) values (getdate(), ?)" 
    command.CommandTimeout = 5 
    command.CommandType = adCmdText 
    command.Parameters.Append command.CreateParameter("Value", adVarChar, adParamInput, 0, value) 
    command.Prepared = True 
    command.Execute 
    Set command = Nothing 
    connection.Close 
    Set connection = Nothing 
    Response.End 
%> 

当我执行它,我得到这个错误:

ADODB.Command error '800a0d5d' 
Application uses a value of the wrong type for the current operation. 
/test/default.asp, line 32 

32号线是

command.Parameters.Append command.CreateParameter("Value", adVarChar, adParamInput, 0, value) 

我试过改变Size参数,无济于事。

环顾四周,我发现How to call SQL Server stored procedures from ASP的Microsoft知识库文章称网,它的“方法1”的例子很有趣,因为它不声明参数,但读取它们形成服务器:

cmd.CommandText = "sp_test" 
cmd.CommandType = adCmdStoredProc 
cmd.Parameters.Refresh 
cmd.Parameters(1) = 11 

所以我创建的存储的过程来执行INSERT

CREATE PROCEDURE dbo.TestInsertion (@CreationDate DATETIME, @Value TEXT) AS BEGIN 
    SET NOCOUNT ON 
    INSERT INTO dbo.Test (CreationDate, Value) VALUES (@CreationDate, @Value) 
    SELECT TestId = SCOPE_IDENTITY() 
END 

和改性在页面这样的ADODB.Command位:

Dim command : Set command = Server.CreateObject("ADODB.Command") 
command.ActiveConnection = connection 
command.CommandText = "dbo.TestInsertion" 
command.CommandTimeout = 5 
command.CommandType = adCmdStoredProc 
command.Parameters.Refresh 
command.Parameters(1).Value = Date 
command.Parameters(2).Value = value 
command.Prepared = True 
command.Execute 
Set command = Nothing 

它工作。

是否有可能在传统的ASP中指定TEXT参数ADODB.Command s而不使用存储过程?

回答

8

尝试通过adLongVarChar常量为文本数据类型。

With adLongVarChar您还需要指定value的大小,否则您将收到Parameter object is improperly defined. Inconsistent or incomplete information was provided.错误。

command.Parameters.Append command.CreateParameter("Value", adLongVarChar, adParamInput, Len(value), value) 

查看一下ADO Data Type Mappings

+0

优秀,'adLongVarChar'工程;但是我必须指定参数的长度,否则我得到'Parameter对象被错误地定义。提供了不一致或不完整的信息。我已经相应地更新了你的答案。 – Albireo