本人用的是asp.net开发,在后台写入了数据库插入语句,当运行时总是会抛出字符串或二进制类型数据被截断的错误,但是我将这条语句拿出来放到T—SQL里直接运行就没问题,这可能是什么原因造成的
这是数据库定义的类型char(2),nchar(50),datetime,datetime,bit,bit
这是我插入的数据'04','042015012831','2015-01-28','2015-01-28',0,0
直接运行没问题
可能是你NET没有学好的原因。
你插入语句用的是字符串拼接的方式的话,
1、容易有SQL注入漏洞
2、容易出现你说的这个问题。
用的是SqlParameter,然后赋这几个值进去,补充了一下问题,前辈看一下
@伊夏: sqlParameter怎么用的?
既然你要遮遮掩掩的,我简单说下我的看法吧
1、char(2),一般没有必要节省这个硬盘空间,硬盘太便宜了,现在随便一个啥都不懂的毕业生工资也能买好多T硬盘了。
2、我不用VARCHAR,只用NVARCHAR,这样可以避免出现字符编码问题。
3、前两天就有一家伙是因为Sqlparameter没有设置字段类型出的问题,
因为SqlParameter不设置类型,大部份情况下是可以的,小部份情况就会出错了。
4、bit类型在ado.net里面不是处理为TRUE/FALSE吗?还是我使用ORM太久了,已经忘记ADO.net是怎么处理bit类型的。
@爱编程的大叔: 多谢,确实是SqlParameter的问题,直接用拼接语句就可以实现了
定义的参数字段长度问题。
你的 SqlParameter 咋写的?
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;
赋的值就如我补充的那样
@伊夏: 假设 ProductGroup 在数据库中对应的列数据类型是 char(2),那么
new SqlParameter("@ProductGroup",ProductGroup)
改成这样:
var param = new SqlParameter("@ProductGroup",SqlDbType.Char,2);
param.Value = ProductGroup;
@Launcher: 这意思啊,多谢,回我好好研究一下SqlParameter
@伊夏: 错误往往出现在你以为不会出错的地方,果然如估计一般,你没有设置Parameter的数据类型。
好吧,我只能给你的建议,用用代码生成器,看看他的sqlparameter怎么写的,我们自己写的是可以用,但是觉得老烦人了,代码生成器就是王道