2011-12-13 36 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