【问题标题】:parameterized insert query not working参数化插入查询不起作用
【发布时间】:2011-12-21 10:59:53
【问题描述】:

我正在尝试运行我认为是相当简单的参数化插入查询,但遇到了各种各样的问题。 SQL EXPRESS 08R2, VB.net

这是构建参数的 VB 代码... 更新变量名称:

itemDataSource1.ConnectionString = ConfigurationManager.ConnectionStrings("MyConnectionString").ToString()
itemDataSource1.InsertCommandType = SqlDataSourceCommandType.StoredProcedure
itemDataSource1.InsertParameters.Add("@short_Text", short_Text) 
itemDataSource1.InsertParameters.Add("@foreignTable", foreignTable)
itemDataSource1.InsertCommand = "usp_insertLangShortText"         ' Call stored procedure

'***********************************************************************
 ' Begin the insertion. Check for errors during insert process.

Dim rowsAffected As Integer = 0
rowsAffected = itemDataSource1.Insert()

这是我尝试执行插入的 SP..

@short_Text varchar(250), 
@foreignTable varchar(250)

AS
/* SET NOCOUNT ON */
DECLARE @sql varchar(max);

   BEGIN
SET @sql =  'INSERT INTO ' + @foreignTable + ' (short_Text) VALUES (''' + @short_Text + ''')';
   END

print (@sql) 
EXECUTE(@sql); 
SET @sql = '' 

RETURN

欢迎任何关于如何更智能地编码的建议。

这是错误.... System.Data.SqlClient.SqlException:过程或函数 usp_insertLangShortText 指定的参数过多。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,Boolean breakConnection) 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System .Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 在 System.Data.SqlClient .SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 在 System.Data.SqlClient。 SqlCommand.InternalExecuteNonQuery(DbAsyncResult 结果,Str ing methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand command, DataSourceOperation operation) at System.Web.UI.WebControls.SqlDataSourceView.ExecuteInsert( IDictionary values) at System.Web.UI.WebControls.SqlDataSource.Insert() at par_importExcelDataPTS.GetRootID(String short_Text, Int32 string_id, String dbName, String Lang_code) in C:\Users

【问题讨论】:

    标签: vb.net tsql


    【解决方案1】:

    参数名称不同是否有特定原因,因为这可能会导致您的问题:

    c# - itemDataSource1.InsertParameters.Add("short_Text", short_Text)

    SQL - @shrtText varchar(250)

    应该不是:itemDataSource1.InsertParameters.Add("shrtText", short_Text)

    【讨论】:

    • 不,没有解决问题。
    • 你可以试试itemDataSource1.InsertParameters["short_Text"].DefaultValue = short_Text 两个参数而不是 .add 方法
    【解决方案2】:

    相信你在添加参数的时候可能需要在参数名前加一个@:

    itemDataSource1.InsertParameters.Add("@short_Text", short_Text) 
    itemDataSource1.InsertParameters.Add("@foreignTable", foreignTable)
    

    此外,如果您的 short_text 包含任何单引号,则 SQL 将无法评估。要解决此问题,请将 short_Text 中的所有单引号替换为两个单引号。

    如果这不能解决您的问题,您能否发布您收到的确切错误消息?

    【讨论】:

    • 撇号已全部转义,文本字符串没有不更新的撇号。我会尝试更改 @ 符号。
    • 啊,例外有帮助:由于某种原因,您的参数没有成功。关于为什么会这样,我有两个想法:1)设置 InsertCommand 时参数被清除;尝试将其移动到设置参数的区域上方; 2) short_text 什么都不是;在调试中进入代码并确保已设置此值。
    • 进入代码 short_text 设置得很好。我将尝试移动 InsertCommand。请注意,当我执行行时, rowsAffected = itemDataSource1.Insert() ,参数也被设置。
    • 您的错误信息可能已更改:错误是参数过多。您能否在调用 insert 之前检查参数的数量(可能是参数已经添加;您可能需要在添加新参数之前清除参数集合,或者它们可能会自动添加)。如果只有 2 个参数,那么问题在于您的存储过程定义(即它不再有 2 个参数)。如果参数是.Net自动添加的,你可能有3个参数,第一个是过程的返回值。
    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 2017-05-19
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多