C# 将行中的字从文件加载到sqlite表
我在c#中创建函数,逐行读取,然后将行加载到sqlite(s3db) 但是有没有更快的办法?我通过sqlite管理员应用程序创建了表。 sqlite可以加载自己的文件并使其成为表吗C# 将行中的字从文件加载到sqlite表,c#,sqlite,C#,Sqlite,我在c#中创建函数,逐行读取,然后将行加载到sqlite(s3db) 但是有没有更快的办法?我通过sqlite管理员应用程序创建了表。 sqlite可以加载自己的文件并使其成为表吗 我说的是三百多万字(一行一个字) 注:如果有问题,请更正我的主题:)您可以试试。通过阅读本文,请特别注意此处使用的参数化查询,您应该使用这些查询来代替示例中insSQL变量中的字符串连接。您可以尝试。通过阅读本文,请特别注意此处使用的参数化查询,您应该使用这些查询,而不是样本中insSQL变量中的字符串连接。使用事
我说的是三百多万字(一行一个字)
注:如果有问题,请更正我的主题:)您可以试试。通过阅读本文,请特别注意此处使用的参数化查询,您应该使用这些查询来代替示例中
insSQL
变量中的字符串连接。您可以尝试。通过阅读本文,请特别注意此处使用的参数化查询,您应该使用这些查询,而不是样本中insSQL
变量中的字符串连接。使用事务通常会大大加快速度,具体取决于所需的批处理大小。我对DataAdapters和数据源不是100%熟悉,但不是每次都创建一个新连接来插入一行,而是修改代码以使用一个连接,并使用SQLiteConnection.BeginTransaction()和完成时调用Transaction.Commit() 根据所需的批处理大小,使用事务通常会大大加快速度。我对DataAdapters和数据源不是100%熟悉,但不是每次都创建一个新连接来插入一行,而是修改代码以使用一个连接,并使用SQLiteConnection.BeginTransaction()和完成时调用Transaction.Commit() 是的,有一种更快的方法,使用以下技术:
1) 只打开到数据库的连接一次
2) 使用参数化命令可获得更好的性能和更低的开销(不必在每次传递时使用新字符串)
3) 将整个操作包装在事务中。一般来说,这将提高您的绩效
注意,我没有显示事务回滚或关闭连接,这也是应该实现的最佳实践
private void LoadFromDictionary()
{
Encoding enc = Encoding.GetEncoding(1250);
string strConn = @"Data Source=C:\Temp2\dictionary.s3db";
SqliteConnection conn = new SqliteConnection(strConn);
conn.Open();
string insSQL = "insert or ignore into wyrazy values(@Word)";
DbCommand oCommand = conn.CreateCommand();
oCommand.Connection = conn;
oCommand.CommandText = insSQL;
DbParameter oParameter = oCommand.CreateParameter();
oParameter.Name = "@Word";
oParameter.DbType = DbType.String;
oParameter.Size = 100;
oCommand.Parameters.Add(oParameter);
DbTransaction oTransaction = conn.BeginTransaction();
using (StreamReader r = new StreamReader("c:\\Temp2\\dictionary.txt", enc))
{
string line = "";
while ((line = r.ReadLine()) != null)
{
line = line.Trim();
if (!string.IsNullOrEmpty(line)) {
oParameter.Value = line;
oCommand.ExecuteNonQuery();
}
}
}
oTransaction.Commit();
conn.Close();
MessageBox.Show("Finally :P", "Info");
}
是的,有一种更快的方法,使用以下技术: 1) 只打开到数据库的连接一次 2) 使用参数化命令可获得更好的性能和更低的开销(不必在每次传递时使用新字符串) 3) 将整个操作包装在事务中。一般来说,这将提高您的绩效 注意,我没有显示事务回滚或关闭连接,这也是应该实现的最佳实践
private void LoadFromDictionary()
{
Encoding enc = Encoding.GetEncoding(1250);
string strConn = @"Data Source=C:\Temp2\dictionary.s3db";
SqliteConnection conn = new SqliteConnection(strConn);
conn.Open();
string insSQL = "insert or ignore into wyrazy values(@Word)";
DbCommand oCommand = conn.CreateCommand();
oCommand.Connection = conn;
oCommand.CommandText = insSQL;
DbParameter oParameter = oCommand.CreateParameter();
oParameter.Name = "@Word";
oParameter.DbType = DbType.String;
oParameter.Size = 100;
oCommand.Parameters.Add(oParameter);
DbTransaction oTransaction = conn.BeginTransaction();
using (StreamReader r = new StreamReader("c:\\Temp2\\dictionary.txt", enc))
{
string line = "";
while ((line = r.ReadLine()) != null)
{
line = line.Trim();
if (!string.IsNullOrEmpty(line)) {
oParameter.Value = line;
oCommand.ExecuteNonQuery();
}
}
}
oTransaction.Commit();
conn.Close();
MessageBox.Show("Finally :P", "Info");
}
前几天我刚做了这件事,首先使用了事务和参数化查询。我能够在大约一分钟内加载1600万行
internal static void FastInsertMany(DbConnection cnn)
{
using (DbTransaction dbTrans = cnn.BeginTransaction())
{
using (DbCommand cmd = cnn.CreateCommand())
{
cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)";
DbParameter Field1 = cmd.CreateParameter();
cmd.Parameters.Add(Field1);
for (int n = 0; n < 100000; n++)
{
Field1.Value = n + 100000;
cmd.ExecuteNonQuery();
}
}
dbTrans.Commit();
}
}
内部静态无效FastnSertMany(DbConnection cnn)
{
使用(DbTransaction dbTrans=cnn.BeginTransaction())
{
使用(DbCommand cmd=cnn.CreateCommand())
{
cmd.CommandText=“插入测试用例(MyValue)值(?);
DbParameter Field1=cmd.CreateParameter();
cmd.Parameters.Add(字段1);
对于(int n=0;n<100000;n++)
{
字段1.值=n+100000;
cmd.ExecuteNonQuery();
}
}
dbTrans.Commit();
}
}
前几天我刚做了这件事,首先使用了事务和参数化查询。我能够在大约一分钟内加载1600万行
internal static void FastInsertMany(DbConnection cnn)
{
using (DbTransaction dbTrans = cnn.BeginTransaction())
{
using (DbCommand cmd = cnn.CreateCommand())
{
cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)";
DbParameter Field1 = cmd.CreateParameter();
cmd.Parameters.Add(Field1);
for (int n = 0; n < 100000; n++)
{
Field1.Value = n + 100000;
cmd.ExecuteNonQuery();
}
}
dbTrans.Commit();
}
}
内部静态无效FastnSertMany(DbConnection cnn)
{
使用(DbTransaction dbTrans=cnn.BeginTransaction())
{
使用(DbCommand cmd=cnn.CreateCommand())
{
cmd.CommandText=“插入测试用例(MyValue)值(?);
DbParameter Field1=cmd.CreateParameter();
cmd.Parameters.Add(字段1);
对于(int n=0;n<100000;n++)
{
字段1.值=n+100000;
cmd.ExecuteNonQuery();
}
}
dbTrans.Commit();
}
}
Hmm我对DbTransaction oTransaction=conn.BeginTransaction()有问题代码>由于对象的当前状态,操作无效。
抱歉,忘记添加打开连接。修改了代码(为了完整性还添加了close)。你能解释一下它是如何工作的吗?在sqlite中的表“Words”中,我编写了创建表[Words]([word]VARCHAR(100)UNIQUE NOT NULL主键)
我无法输入单词由于违反约束而中止列wyraz NOT UNIQUE
我该怎么办?听起来文件或表中有重复的单词。如果您在未清除表的情况下多次运行应用程序,则您将遇到此问题。要插入或忽略的insert语句(有关详细信息,请参阅)。文件中的第一个单词是aa
,第二个单词是aaa
。该文件只包含唯一的单词。嗯,我对DbTransaction oTransaction=conn.BeginTransaction()有问题代码>由于对象的当前状态,操作无效。
抱歉,忘记添加打开连接。修改了代码(为了完整性还添加了close)。你能解释一下它是如何工作的吗?在sqlite中的表“Words”中,我编写了创建表[Words]([word]VARCHAR(100)UNIQUE NOT NULL主键)
我无法输入单词由于违反约束而中止列wyraz NOT UNIQUE
我该怎么办?听起来文件或表中有重复的单词。如果您在未清除表的情况下多次运行应用程序,则您将遇到此问题。要插入或忽略的insert语句(有关详细信息,请参阅)。文件中的第一个单词是aa
,第二个单词是aaa
。该文件仅包含唯一的单词。