C#更改数据库内容

LiuShanLiang 2013-08-09 09:30:28
各位,我向SQL Server2008中的一个表添加10万条数据,当进行到八万多条的时候会出现错误
“将截断字符串或二进制数据。”
查看系统日志,有错误信息“资源池 'default' 没有足够的系统内存来运行此查询。”。
代码如下:
for (int i = 1; i < 100000; i++)
{
sqlCmd += "insert into dbo.Time(ID,Time) values(" + i.ToString() + ",'1');";
}
using (SqlConnection conn = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sqlCmd, conn))
{
conn.Open();
int row = cmd.ExecuteNonQuery();
}
}
是运行cmd.ExecuteNonQuery()的时候报的错,应该不是查询语句sqlCmd太长的原因。请问这是什么原因?
因为已经加了八万多条数据,我再去更新,代码如下:
time = DateTime.Now;
strTime = time.Year.ToString() + "/" + time.Month.ToString() + "/" + time.Date.Day.ToString() + "/" + time.Hour.ToString() + "/" + time.Minute.ToString() + "/" + time.Second.ToString();

sqlCmd = @"update dbo.Time set Time=" + "'" + strTime + "' where ID <200;";
using (SqlConnection conn = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sqlCmd, conn))
{
conn.Open();
cmd.ExecuteScalar();
}
}
还是在执行cmd.ExecuteScalar()时报错,报错信息与系统日志都同上个例子一样。
各位大侠,帮忙解决下吧!!!
...全文
293 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxm20003 2013-08-10
  • 打赏
  • 举报
回复
数据格式检查看看呢
EnForGrass 2013-08-10
  • 打赏
  • 举报
回复
引用 21 楼 Chinajiyong 的回复:
[quote=引用 11 楼 LiuShanLiang 的回复:] [quote=引用 4 楼 Chinajiyong 的回复:] time = DateTime.Now; strTime = time.Year.ToString() + "/" + time.Month.ToString() + "/" + time.Date.Day.ToString() + "/" + time.Hour.ToString() + "/" + time.Minute.ToString() + "/" + time.Second.ToString(); 调试看看strtime的值 sqlCmd = @"update dbo.Time set Time='" + strTime + "' where ID <200;";
谢谢这么快的回复。 Time的类型是nchar(10),我修改了strTime=time.Year.ToString() + "/" +time.Month.ToString();现在可以了。在0.23秒更新8万多条数据。 然后重新添加,从50 000到100 000,需要12秒。 然而清空后从1加到100 000,还是报“资源池 'default' 没有足够的系统内存来运行此查询”。我的ID是bigInt型,这是什么原因?[/quote] 其实你的代码就是构造多条insert into语句,进行批量插入[/quote] 类似 我觉得还不如写个存储过程
EnForGrass 2013-08-10
  • 打赏
  • 举报
回复
引用 11 楼 LiuShanLiang 的回复:
[quote=引用 4 楼 Chinajiyong 的回复:] time = DateTime.Now; strTime = time.Year.ToString() + "/" + time.Month.ToString() + "/" + time.Date.Day.ToString() + "/" + time.Hour.ToString() + "/" + time.Minute.ToString() + "/" + time.Second.ToString(); 调试看看strtime的值 sqlCmd = @"update dbo.Time set Time='" + strTime + "' where ID <200;";
谢谢这么快的回复。 Time的类型是nchar(10),我修改了strTime=time.Year.ToString() + "/" +time.Month.ToString();现在可以了。在0.23秒更新8万多条数据。 然后重新添加,从50 000到100 000,需要12秒。 然而清空后从1加到100 000,还是报“资源池 'default' 没有足够的系统内存来运行此查询”。我的ID是bigInt型,这是什么原因?[/quote] 其实你的代码就是构造多条insert into语句,进行批量插入
  • 打赏
  • 举报
回复
唉,修改一下两个for for (int j = 0; j< 1000; j++) { sqlCmd = ""; for (int i = 0; i < 100; i++) sqlCmd += "insert into dbo.Time(ID,Time) values(" + (j*100+i).ToString() + ",'1');"; cmd.CommandText = sqlCmd; row += cmd.ExecuteNonQuery(); }
  • 打赏
  • 举报
回复
类似这样的做法: using (SqlConnection conn = new SqlConnection(constr)) { SqlCommand cmd = conn.CreateCommand(); conn.Open(); int row = 0; for (int j = 1; j< 1000; j++) { sqlCmd = ""; for (int i = 1; i < 100; i++) sqlCmd += "insert into dbo.Time(ID,Time) values(" + i.ToString() + ",'1');"; cmd.CommandText = sqlCmd; row += cmd.ExecuteNonQuery(); } } 1. 用不着画蛇添足地为 DbCommand 去写什么 using{}。 2. 一个sql命令肯定不能超过4000个(unicode)字符。至于你说“是运行cmd.ExecuteNonQuery()的时候报的错,应该不是查询语句sqlCmd太长的原因”,那是你没有认真听懂别人跟你说“sqlCmd太长”到底是什么意思。
LiuShanLiang 2013-08-10
  • 打赏
  • 举报
回复
StringBuilder循环会快一些,但是在执行int row = cmd.ExecuteNonQuery(); 时还是会报错,“资源池 'default' 没有足够的系统内存来运行此查询”。我主要是想测试,C#操作大数据量的时候该怎么处理,现在貌似没什么想法,希望能指点下。
LiuShanLiang 2013-08-09
  • 打赏
  • 举报
回复
引用 4 楼 Chinajiyong 的回复:
time = DateTime.Now; strTime = time.Year.ToString() + "/" + time.Month.ToString() + "/" + time.Date.Day.ToString() + "/" + time.Hour.ToString() + "/" + time.Minute.ToString() + "/" + time.Second.ToString(); 调试看看strtime的值 sqlCmd = @"update dbo.Time set Time='" + strTime + "' where ID <200;";
谢谢这么快的回复。 Time的类型是nchar(10),我修改了strTime=time.Year.ToString() + "/" +time.Month.ToString();现在可以了。在0.23秒更新8万多条数据。 然后重新添加,从50 000到100 000,需要12秒。 然而清空后从1加到100 000,还是报“资源池 'default' 没有足够的系统内存来运行此查询”。我的ID是bigInt型,这是什么原因?
PaulyJiang 2013-08-09
  • 打赏
  • 举报
回复
截断字符串或二进制数据 =>超长
wangchangming 2013-08-09
  • 打赏
  • 举报
回复
引用 15 楼 LiuShanLiang 的回复:
[quote=引用 14 楼 wangchangming 的回复:] 修改字段长度就不说了,你试着用下面的方法,先生成数据再一批插入到表可能性能要好些,我测试10万条是2秒。 语句如下:
INSERT INTO t_time
SELECT n,
       n
FROM   (
           SELECT X.NUMBER * 2048 + Y.NUMBER AS N
           FROM   (
                      SELECT DISTINCT     NUMBER
                      FROM   MASTER.dbo.spt_values
                      WHERE  NAME IS      NULL
                  ) X
                  JOIN (
                           SELECT DISTINCT NUMBER
                           FROM   MASTER.dbo.spt_values
                           WHERE  NAME IS NULL
                       ) Y
                       ON  1 = 1
       ) a
WHERE  n <= 100000 AND n > 0
我也在机器上试了一下,也能在两秒内完成。非常感谢。 但我主要是想测试一下用C#连接的速度,怎么样才能提高,发现同样的工作,C#比C++慢太多了。[/quote] 不太清楚你想测试C#连接的什么速度
for (int i = 1; i < 100000; i++)
{
    sqlCmd += "insert into dbo.Time(ID,Time) values(" + i.ToString() + ",'1');";
}
using (SqlConnection conn = new SqlConnection(constr))
{
    using (SqlCommand cmd = new SqlCommand(sqlCmd, conn))
    {
        conn.Open();
        int row = cmd.ExecuteNonQuery();
    }
}
你试着将sqlCmd定义成StringBuilder看看, StringBuilder sqlCmd = new StringBuilder(); for (int i = 1; i < 100000; i++) { sqlCmd.Append("insert into dbo.Time(ID,Time) values(" + i.ToString() + ",'1');"); } 看效果会不会好点,其实这种循环10万次生成insert脚本,然后发送给数据库处理这种方式本来就不太可取,虽然要实现的效果是一样的,但不同的处理方式使得用户的体验也完全不一样。
夜色镇歌 2013-08-09
  • 打赏
  • 举报
回复
字段长度不够,是哪条数据太长了 存不下
再来壹串 2013-08-09
  • 打赏
  • 举报
回复
把 Time表ID字段长度设置大一点 ,nvarchar(10) 插测试数据直接用脚本就行了嘛!

GO
DECLARE @i INT =1

WHILE 1=1
BEGIN
	IF @i>100000
		BREAK
	
	INSERT INTO t_Time(ID,[Time]) VALUES(@i, '1')
	
	SET @i=@i+1
END
dota_sky_god 2013-08-09
  • 打赏
  • 举报
回复
楼上的说的没错,某个字段的输入超过长度了
黄黄涛 2013-08-09
  • 打赏
  • 举报
回复
插入的数据中,某个字段的值太长了,而你设置的那个字段类型长度不够用
EnForGrass 2013-08-09
  • 打赏
  • 举报
回复
time = DateTime.Now; strTime = time.Year.ToString() + "/" + time.Month.ToString() + "/" + time.Date.Day.ToString() + "/" + time.Hour.ToString() + "/" + time.Minute.ToString() + "/" + time.Second.ToString(); 调试看看strtime的值 sqlCmd = @"update dbo.Time set Time='" + strTime + "' where ID <200;";
lhx527099095 2013-08-09
  • 打赏
  • 举报
回复
数据库字段长度不够 修改下就行了 或者把那条长的记录内容改小点
蝶恋花雨 2013-08-09
  • 打赏
  • 举报
回复
一是修改数据库字段大小; 二是加强数据强壮性,严格的输入判断。
蝶恋花雨 2013-08-09
  • 打赏
  • 举报
回复
哪条数据超过字段长度了。所有灰报错。修改数据太多还是看看哪个字段长度不够。改下字段
xujinli88 2013-08-09
  • 打赏
  • 举报
回复
数据库中的字段短了 插入的值那个字段修改长一点
LiuShanLiang 2013-08-09
  • 打赏
  • 举报
回复
引用 14 楼 wangchangming 的回复:
修改字段长度就不说了,你试着用下面的方法,先生成数据再一批插入到表可能性能要好些,我测试10万条是2秒。 语句如下:
INSERT INTO t_time
SELECT n,
       n
FROM   (
           SELECT X.NUMBER * 2048 + Y.NUMBER AS N
           FROM   (
                      SELECT DISTINCT     NUMBER
                      FROM   MASTER.dbo.spt_values
                      WHERE  NAME IS      NULL
                  ) X
                  JOIN (
                           SELECT DISTINCT NUMBER
                           FROM   MASTER.dbo.spt_values
                           WHERE  NAME IS NULL
                       ) Y
                       ON  1 = 1
       ) a
WHERE  n <= 100000 AND n > 0
我也在机器上试了一下,也能在两秒内完成。非常感谢。 但我主要是想测试一下用C#连接的速度,怎么样才能提高,发现同样的工作,C#比C++慢太多了。
wangchangming 2013-08-09
  • 打赏
  • 举报
回复
修改字段长度就不说了,你试着用下面的方法,先生成数据再一批插入到表可能性能要好些,我测试10万条是2秒。

语句如下:
INSERT INTO t_time
SELECT n,
n
FROM (
SELECT X.NUMBER * 2048 + Y.NUMBER AS N
FROM (
SELECT DISTINCT NUMBER
FROM MASTER.dbo.spt_values
WHERE NAME IS NULL
) X
JOIN (
SELECT DISTINCT NUMBER
FROM MASTER.dbo.spt_values
WHERE NAME IS NULL
) Y
ON 1 = 1
) a
WHERE n <= 100000 AND n > 0
加载更多回复(2)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧