在 C# 中将批量数据提取到 DB 文件
Bulk Data extraction to DB File in C#
我在记事本文件中有大量数据,比如 45,00,000 行数据,
我把那个巨大的文件分成小文件,
我有如下数据:
('1','dsamp','tty','tmp'....)
and so on
现在我正在一个一个地读取文件并使用插入脚本和一段 C# 代码将它们写入 .mdf 文件,但是当我遇到一些错误时我无法找到错误所在我想从头开始并从第 0 行插入。
有没有最好的方法或代码或工具来做到这一点
我的代码看起来像这样
private void Form1_Load(object sender, EventArgs e)
{
int i = 0;
try
{
string const_state = "INSERT INTO Authors1 VALUES";
string conn = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\users\srikanth\documents\visual studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\SampleDB.mdf;Integrated Security=True;Connect Timeout=30";
SqlConnection cn = new SqlConnection(conn);
cn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
string line;
System.IO.StreamReader file = new System.IO.StreamReader("C:\Users\Public\New1.txt");
while ((line = file.ReadLine()) != null)
{
line = line.Trim();
line = line.TrimEnd(',', ',',',', '.');
cmd.CommandText = const_state + line+";";
cmd.ExecuteNonQuery();
i++;
}
MessageBox.Show(i.ToString());
file.Close();
}
catch(Exception ex)
{
MessageBox.Show(i.ToString());
MessageBox.Show(ex.ToString());
}
}
}
}
提前致谢
我会做的是为您的 ExecuteNonQuery()
呼叫设置一个 try/catch
块。像这样:
while ((line = file.ReadLine()) != null)
{
line = line.Trim();
line = line.TrimEnd(',', ',',',', '.');
cmd.CommandText = const_state + line+";";
try
{
cmd.ExecuteNonQuery();
}
catch
{
// dump cmd.CommandText somewhere as well as
// the actual exception details
//
// that'll give you two things: 1) the specific
// issue, and 2) the actual INSERT statement that
// failed
}
i++;
}
请参阅我在 catch { }
块中关于如何处理 INSERT 错误的评论
通过在 ExecuteNonQuery()
调用周围设置 try/catch
,您将在 which INSERT
语句失败时遇到细粒度问题,因为以及错误的特定异常。这样做的另一个好处是它允许您继续执行而不是将该异常冒泡到外部 try/catch
逻辑。当然,除非你想停止执行,在这种情况下你可以从内部 catch { }
块中重新抛出异常。这完全取决于您希望如何处理故障。
注意:对于你的外部 try/catch
块,你应该包括一个 finally { }
,你调用 SqlConnection.Dispose()
来释放连接并处理对象 (cn.Dispose()
).
我在记事本文件中有大量数据,比如 45,00,000 行数据,
我把那个巨大的文件分成小文件,
我有如下数据:
('1','dsamp','tty','tmp'....)
and so on
现在我正在一个一个地读取文件并使用插入脚本和一段 C# 代码将它们写入 .mdf 文件,但是当我遇到一些错误时我无法找到错误所在我想从头开始并从第 0 行插入。
有没有最好的方法或代码或工具来做到这一点
我的代码看起来像这样
private void Form1_Load(object sender, EventArgs e)
{
int i = 0;
try
{
string const_state = "INSERT INTO Authors1 VALUES";
string conn = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\users\srikanth\documents\visual studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\SampleDB.mdf;Integrated Security=True;Connect Timeout=30";
SqlConnection cn = new SqlConnection(conn);
cn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
string line;
System.IO.StreamReader file = new System.IO.StreamReader("C:\Users\Public\New1.txt");
while ((line = file.ReadLine()) != null)
{
line = line.Trim();
line = line.TrimEnd(',', ',',',', '.');
cmd.CommandText = const_state + line+";";
cmd.ExecuteNonQuery();
i++;
}
MessageBox.Show(i.ToString());
file.Close();
}
catch(Exception ex)
{
MessageBox.Show(i.ToString());
MessageBox.Show(ex.ToString());
}
}
}
}
提前致谢
我会做的是为您的 ExecuteNonQuery()
呼叫设置一个 try/catch
块。像这样:
while ((line = file.ReadLine()) != null)
{
line = line.Trim();
line = line.TrimEnd(',', ',',',', '.');
cmd.CommandText = const_state + line+";";
try
{
cmd.ExecuteNonQuery();
}
catch
{
// dump cmd.CommandText somewhere as well as
// the actual exception details
//
// that'll give you two things: 1) the specific
// issue, and 2) the actual INSERT statement that
// failed
}
i++;
}
请参阅我在 catch { }
块中关于如何处理 INSERT 错误的评论
通过在 ExecuteNonQuery()
调用周围设置 try/catch
,您将在 which INSERT
语句失败时遇到细粒度问题,因为以及错误的特定异常。这样做的另一个好处是它允许您继续执行而不是将该异常冒泡到外部 try/catch
逻辑。当然,除非你想停止执行,在这种情况下你可以从内部 catch { }
块中重新抛出异常。这完全取决于您希望如何处理故障。
注意:对于你的外部 try/catch
块,你应该包括一个 finally { }
,你调用 SqlConnection.Dispose()
来释放连接并处理对象 (cn.Dispose()
).