首页 新闻 会员 周边 捐助

求助:后台SQL语句运行问题

0
[已解决问题] 解决于 2015-02-03 18:41

本人用的是asp.net开发,在后台写入了数据库插入语句,当运行时总是会抛出字符串或二进制类型数据被截断的错误,但是我将这条语句拿出来放到T—SQL里直接运行就没问题,这可能是什么原因造成的

问题补充:

这是数据库定义的类型char(2),nchar(50),datetime,datetime,bit,bit

这是我插入的数据'04','042015012831','2015-01-28','2015-01-28',0,0

直接运行没问题 

emsui的主页 emsui | 初学一级 | 园豆:77
提问于:2015-01-30 10:47
< >
分享
最佳答案
2

可能是你NET没有学好的原因。

你插入语句用的是字符串拼接的方式的话,

1、容易有SQL注入漏洞

2、容易出现你说的这个问题。

奖励园豆:5
爱编程的大叔 | 高人七级 |园豆:30844 | 2015-01-30 10:50

用的是SqlParameter,然后赋这几个值进去,补充了一下问题,前辈看一下

emsui | 园豆:77 (初学一级) | 2015-01-30 10:55

@伊夏: sqlParameter怎么用的?

既然你要遮遮掩掩的,我简单说下我的看法吧

1、char(2),一般没有必要节省这个硬盘空间,硬盘太便宜了,现在随便一个啥都不懂的毕业生工资也能买好多T硬盘了。

2、我不用VARCHAR,只用NVARCHAR,这样可以避免出现字符编码问题。

3、前两天就有一家伙是因为Sqlparameter没有设置字段类型出的问题,

因为SqlParameter不设置类型,大部份情况下是可以的,小部份情况就会出错了。

4、bit类型在ado.net里面不是处理为TRUE/FALSE吗?还是我使用ORM太久了,已经忘记ADO.net是怎么处理bit类型的。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-01-30 11:05

@爱编程的大叔: 多谢,确实是SqlParameter的问题,直接用拼接语句就可以实现了

emsui | 园豆:77 (初学一级) | 2015-01-30 11:59
其他回答(3)
0

定义的参数字段长度问题。

幻天芒 | 园豆:37205 (高人七级) | 2015-01-30 10:48
0

你的 SqlParameter 咋写的?

Launcher | 园豆:45050 (高人七级) | 2015-01-30 11:27

string sqlInsert = "insert into PPR_PolicyDispatch (ProductGroup,PolicyNumber,PolicyDate,ConvTime,State,boolIfM) values (@ProductGroup,@PolicyNumber,@PolicyDate,@ConvTime,@State,@boolIfM)";
SqlParameter[] prams = new SqlParameter[]
{
new SqlParameter("@ProductGroup",ProductGroup),
new SqlParameter("@PolicyNumber",PolicyNumber),
new SqlParameter("@PolicyDate",PolicyDate),
new SqlParameter("@ConvTime",ConvTime),
new SqlParameter("@State",bState),
new SqlParameter("@boolIfM",bBoolIfM)
};
return CommonFun.UpdateInsertDeleteInfo(strsql, sqlInsert, prams, prams, "INSERT");

 

 

转到

try
{
object obj = SqlHelper.ExecuteScalar(DBConn, CommandType.Text, selectSql, selectPrams);

if ((int)obj > 0)
{
return false;
}
else
{
int i = SqlHelper.ExecuteNonQuery(DBConn, CommandType.Text, sql, prams);
if (i > 0)
{
return true;
}
else
{
return false;
}
}
}
catch (Exception ex)
{
throw ex;
}
return false;

赋的值就如我补充的那样

支持(0) 反对(0) emsui | 园豆:77 (初学一级) | 2015-01-30 12:56

@伊夏: 假设 ProductGroup 在数据库中对应的列数据类型是 char(2),那么

new SqlParameter("@ProductGroup",ProductGroup)

改成这样:

var param = new SqlParameter("@ProductGroup",SqlDbType.Char,2);

param.Value = ProductGroup;

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-01-30 13:05

@Launcher: 这意思啊,多谢,回我好好研究一下SqlParameter

支持(0) 反对(0) emsui | 园豆:77 (初学一级) | 2015-01-30 13:18

@伊夏: 错误往往出现在你以为不会出错的地方,果然如估计一般,你没有设置Parameter的数据类型。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2015-01-30 14:24
0

好吧,我只能给你的建议,用用代码生成器,看看他的sqlparameter怎么写的,我们自己写的是可以用,但是觉得老烦人了,代码生成器就是王道

_Vegetables | 园豆:586 (小虾三级) | 2015-01-30 13:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册