【发布时间】:2014-12-10 20:33:13
【问题描述】:
tldnr;
在尝试将SqlParameter 值放入数据库之前,我应该如何检查它们的界限?
加长版:
所以,我有这些动态生成的 SQL 语句,我在其中传递了一堆 SqlParameters。
我们声明SqlParameters的方式就是
new SqlParameter("fieldName", value)
我们让运行时找出 dbtype 是什么。
也就是说,有时更新/插入语句会失败,我们想通过边界检查来确定哪个字段太大(因为我们的服务器只告诉我们字段更新失败,而不是哪个)。也就是说,我们不能在只允许 1 位的列中放入两位数 (say a decimal(1,0) for example.)
我们在内存中有列的模式(information_schema.columns ftw),所以我们可以尝试对 SqlParameter 值进行边界检查,但是由于该值是一个对象,甚至不一定是数字类型,所以应该怎么做我检查一个值是否在范围内?
还是我把问题弄得太难了,而是应该在构造 SqlParameters 时提供精度和比例?或者更好的是,我们是否应该使用反映数据库中列的类型?
更新:
设置精度/比例似乎没有任何后果,如in this code:
decimal d= 10.0M*(decimal)Math.Pow(10, 6);
SqlParameter p = new SqlParameter("someparam", SqlDbType.Decimal);
p.Precision = (byte)1;
p.Scale = (byte)0;
p.Value = d;
Console.WriteLine(p.SqlValue); // doesn't throw an error, i would think the sql value would be at most 10, not 10 million.
【问题讨论】:
-
我看到您进行了适当的测试,因为在没有 delcared DbType 的情况下创建 SqlParameter 确实不是一个好主意。但是,您没有通过 SqlCommand 执行该操作。我敢打赌,如果您执行了 Execute,将会出现截断,无论是静默还是导致异常。
-
@srutzky:是的,很抱歉,如果我的问题不是很清楚。我的更新语句会转到数据库然后它会失败,但它不会告诉我是哪个参数导致了失败。我的目标只是确定导致失败的参数,我想知道最好的方法是什么。
-
对。我想我得到了那个部分。我的意思是,在您的测试中,您说向 SqlParameter 添加无效值并没有出错,因为您通过
WriteLine看到它,我特别问您是否更改了执行 ExecuteNonQuery/Reader 的代码以包含精度和规模。在至少调用SqlCommand.Execute*方法之前,我不希望 SqlParam 进行验证。但我也在尝试另一种方法来看看它是否有效。 -
我刚刚意识到您是正确的,使用参数的查询的实际执行受参数指定方式的影响。如果指定精度和小数位数,它将抛出参数异常而不是 sqlexception,但是识别有问题的参数仍然是相同的问题。有趣的是我还发现5.0M和5M是不一样的,即使Sql不报错,tdsparser也会报错。
标签: sql-server c#-3.0 sqlparameter