请教大量数据写入数据库

ghghg008 2009-05-30 12:03:09
sql server数据库
c#读入.csv文件
然后一条一条写入数据库(这是我目前的方式,极为不好,请高手给我看看)

public void Exsql(string sql,string tabel,string code , string name)//把数据写入数据库
{
open();
SqlCommand comm = new SqlCommand(sql, mydata.con);//sql为插入储存过程
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@tabel", SqlDbType.VarChar, 50)).Value = tabel;
comm.Parameters.Add(new SqlParameter("@a", SqlDbType.VarChar, 50)).Value = code;
comm.Parameters.Add(new SqlParameter("@b", SqlDbType.VarChar, 50)).Value = name;
mydata.ExecSql(comm);
close();
}

public void insetdata(string str)
{
string[][] tabel = rechar.tabel_Array(str, ' ', '^');//取得数据有100000条
data _data = new data();

for (int i = 0; i < tabel.Length; i++)
{
_data.Exsql("insert", "sz", tabel[i][0], tabel[i][1]);//调用上面的写入数据库。这样明显每次打开关闭数据库。肯定不行,请大家给我支支招
}
}

...全文
189 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghghg008 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 langziqian 的回复:]
不要每次都打开关闭连接
打开一次 全部插入后 再关闭

[/Quote]

public SqlDataReader ExecSql(SqlCommand com)
{
SqlDataReader Dr = com.ExecuteReader(CommandBehavior.CloseConnection);
return Dr;
}
public void Exsql(string sql,string tabel,string code , string name)//把数据写入数据库
{
SqlCommand comm = new SqlCommand(sql, mydata.con);//sql为插入储存过程
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@tabel", SqlDbType.VarChar, 50)).Value = tabel;
comm.Parameters.Add(new SqlParameter("@a", SqlDbType.VarChar, 50)).Value = code;
comm.Parameters.Add(new SqlParameter("@b", SqlDbType.VarChar, 50)).Value = name;
mydata.ExecSql(comm);
}

public void insetdata(string str)
{
string[][] tabel = rechar.tabel_Array(str, ' ', '^');//取得数据有100000条
data _data = new data();
Open()
for (int i = 0; i < tabel.Length; i++)
{
_data.Exsql("insert", "sz", tabel[i][0], tabel[i][1])//这样不行,因为comm只能打开一次执行一次

langziqian 2009-05-30
  • 打赏
  • 举报
回复
不要每次都打开关闭连接
打开一次 全部插入后 再关闭

public void insetdata(string str)
{
string[][] tabel = rechar.tabel_Array(str, ' ', '^');//取得数据有100000条
data _data = new data();
Open()
for (int i = 0; i < tabel.Length; i++)
{
_data.Exsql("insert", "sz", tabel[i][0], tabel[i][1]);//调用上面的写入数据库。这样明显每次打开关闭数据库。肯定不行,请大家给我支支招
}

close()
}
ghghg008 2009-05-30
  • 打赏
  • 举报
回复
我觉得用储存过程,主要是代码分离,程序一目了然。
ghghg008 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiangshun 的回复:]
最好别这样弄啊,数据多了会超时的
直接导就行了
先把CSV文件转成xls文件

C# codestring path = Server.MapPath("a.csv").ToLower();
string path2 = path.Replace(".csv",".xls");


然后在执行下面的SQL语句

SQL codeSELECT * into newtableFROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="a.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
[/Quote]
不懂,能否详细一点啊
ljhcy99 2009-05-30
  • 打赏
  • 举报
回复
存储过程是不是稍微快点?
jiangshun 2009-05-30
  • 打赏
  • 举报
回复
最好别这样弄啊,数据多了会超时的
直接导就行了
先把CSV文件转成xls文件
string   path   =   Server.MapPath("a.csv").ToLower();   
string path2 = path.Replace(".csv",".xls");

然后在执行下面的SQL语句
SELECT * into newtable
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="a.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
ghghg008 2009-05-30
  • 打赏
  • 举报
回复
我以上的程序是取一条数据,交给Exsql方法,(每次都要打开关闭数据库,效率极低。)
能否用导入文件方式写入了。
lingyuanguang 2009-05-30
  • 打赏
  • 举报
回复
暂时没想到更好的呢
皓月明 2009-05-30
  • 打赏
  • 举报
回复
没有好的方法
编程有钱人了 2009-05-30
  • 打赏
  • 举报
回复

/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
//public static void ExecuteSqlTran(Hashtable SQLStringList)
//{
// using (SqlConnection conn = new SqlConnection(connectionString))
// {
// conn.Open();
// using (SqlTransaction trans = conn.BeginTransaction())
// {
// SqlCommand cmd = new SqlCommand();
// try
// {
// //循环
// foreach (DictionaryEntry myDE in SQLStringList)
// {
// string cmdText = myDE.Key.ToString();
// SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
// PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
// int val = cmd.ExecuteNonQuery();
// cmd.Parameters.Clear();
//
}
// trans.Commit();

// }
// catch
// {
// trans.Rollback();
// throw;
// }
// }
// }
//}


怎么用 不用我教你了吧
mzx87 2009-05-30
  • 打赏
  • 举报
回复
insert into 表(字段) select 字段 union select 字段 union select 字段
这样子一直循环 拼凑成一条sql语句 最后执行 不知道效率会不会高点
niitnanfeng 2009-05-30
  • 打赏
  • 举报
回复
你看下c#高级编程里的dataset更新数据。
dingo_123432 2009-05-30
  • 打赏
  • 举报
回复
来晚了
ghghg008 2009-05-30
  • 打赏
  • 举报
回复
好了提交成功。目前速度也还可以。
用的是 insert 递加。不知有没更好的方法。
ghghg008 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mengxj85 的回复:]
直接用SQL语句,拼凑一个很长的语句后再一起执行,这样就可以少些开关闭连接
如:insert into mytb values('','') insert into mytb values('','') insert into mytb values('','') insert into mytb values('','')
[/Quote]
到最后提交时什么也没有做,也没提示错,数据库也没内容。
Sysping1 2009-05-30
  • 打赏
  • 举报
回复
放到DATASET,分批提交!
ghghg008 2009-05-30
  • 打赏
  • 举报
回复

CREATE PROCEDURE [dbo].[insert2]

AS
BEGIN
INSERT gatetable
select [HAIKWAN_TYPE],[HAIKWAN_NAME]
from OpenDataSource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=Yes;DATABASE=E:\海关数据\')...[gate#csv]
END

ghghg008 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ai_li7758521 的回复:]
SQL codeINSERT gatetable
select [HAIKWAN_TYPE],[HAIKWAN_NAME]
from OpenDataSource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=Yes;DATABASE=E:\海关数据\')...[gate#csv]
[/Quote]
消息 7403,级别 16,状态 1,过程 insert2,第 6 行
尚未注册 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0"。
ai_li7758521 2009-05-30
  • 打赏
  • 举报
回复
INSERT gatetable 
select [HAIKWAN_TYPE],[HAIKWAN_NAME]
from OpenDataSource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=Yes;DATABASE=E:\海关数据\')...[gate#csv]
ai_li7758521 2009-05-30
  • 打赏
  • 举报
回复
写个存储过程,一次性导入全部结果集:
导入代码示例:

--sp_configure 'show advanced options', 1;
--GO
--RECONFIGURE;
--GO
--sp_configure 'Ad Hoc Distributed Queries', 1;
--GO
--RECONFIGURE;
--GO
INSERT gatetable
select [HAIKWAN_TYPE],[HAIKWAN_NAME]
from
OpenDataSource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=Yes;DATABASE=E:\海关数据\')...[gate#csv]
加载更多回复(2)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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