【发布时间】:2015-06-01 16:30:19
【问题描述】:
我有一些执行存储过程的代码,而该存储过程又只是运行 INSERT + SELECT 以反馈给调用数据适配器
Public Function mGetDataSet_Trans(ByVal aStrQuery As String, ByRef aObjDS As DataSet, ByVal aStrDSName As String, ByVal aCon As SqlConnection, ByRef aTrans As SqlTransaction) As Boolean
Dim pObjDataAdaptor As New SqlClient.SqlDataAdapter
mGetDataSet_Trans = False
Try
pObjDataAdaptor.SelectCommand = New SqlCommand(aStrQuery, aCon, aTrans)
pObjDataAdaptor.Fill(aObjDS, aStrDSName)
mGetDataSet_Trans = True
Catch SqlExp As SqlException
//do stuff
Throw SqlExp
End Try
End Function
没有什么太复杂的;创建一个数据适配器,给它一个命令和连接,填充一个通过引用传递的新数据集对象,如果有异常则回滚事务。
aStrQuery 基本上是这样的:
"EXECUTE USPSave
@FID='1090802',
@PID='4739933',
@aAType='4',
@aADate='6/1/2015 12:00:00 AM',
@aDiag1='ABC.12',
@aDiag2='ABC.12',
@aDiag3='ABC.12AB',
@aChangedBy='123'"
// SELECT ... FROM myTable WHERE FID = @FID
在USPSave 中,@aDiagX 是VARCHAR(10),所以那里没有问题。更新的表还定义了 VARCHAR(10) 字段,这也不应该是一个问题。
我完全不知道这个异常可能来自哪里,但它是 TRY 块中的 Fill 调用引发了异常。有什么想法吗?
【问题讨论】:
-
请编辑您的问题以包括您的存储过程和相关表 ddl。
-
我建议使用参数集合而不是传入整个字符串来执行。他们这样写很容易受到sql注入。
-
@SeanLange
aStrQuery是安全构建的——它不仅仅是从 UI 中撕下的一些串联字符串.. -
我并不是说它只是一些字符串。我建议您传递一个参数集合,以便您可以轻松构建正确的参数化语句。这也可以解决问题,因为您知道每个参数的数据有多长。
-
@SeanLange 哦,我误会了。我现在明白你的意思了。
标签: asp.net sql-server vb.net