C# sql中几秒钟后消失的“未指定错误”
我构建了一个解析器,它接收存储在xml文件中的数据,并使用linq to sql将其发送到Microsoft Access数据库。我有sql insert命令,它们可以工作。。。直到他们没有 奇怪的是,我运行每个SQL命令,我将它们保存在一个列表中,每次执行一个命令,前40个左右的命令运行良好,直到它们开始出现未指定的错误。问题是,如果我吞下异常,而让异常捕获器继续重试,几秒钟后,它们就会重新开始工作。这意味着它不是SQL查询本身的错误,至少不是它的编写方式的错误 此模式会重复数千次插入。如果我做正常的异常处理,程序只会在错误发生时跳过一些记录,并在导致它暂时消失时继续插入。如果我让它运行它的进程,它会插入一些记录,跳过一些,插入,跳过,重复,最后插入不到2/3的记录 我的电脑为什么只运行40次左右的插入,然后在一个随机但很短的间隔内拒绝运行更多的插入 我不知道是什么导致了这一切 应用程序本机运行;它不使用任何服务器/web通信,我在查找未指定错误时发现的所有错误都指向ADO.NET应用程序中出现的错误 以下是发生错误的代码:C# sql中几秒钟后消失的“未指定错误”,c#,linq-to-sql,C#,Linq To Sql,我构建了一个解析器,它接收存储在xml文件中的数据,并使用linq to sql将其发送到Microsoft Access数据库。我有sql insert命令,它们可以工作。。。直到他们没有 奇怪的是,我运行每个SQL命令,我将它们保存在一个列表中,每次执行一个命令,前40个左右的命令运行良好,直到它们开始出现未指定的错误。问题是,如果我吞下异常,而让异常捕获器继续重试,几秒钟后,它们就会重新开始工作。这意味着它不是SQL查询本身的错误,至少不是它的编写方式的错误 此模式会重复数千次插入。如果我
public static string insertQuery(string sql)
{
string connetionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\Owner\Desktop\Arbeit\TrademarkParserproject1\TrademarkParserproject\bin\x86\Debug\Database.accdb";
OleDbConnection connection;
OleDbDataAdapter oledbAdapter = new OleDbDataAdapter();
connection = new OleDbConnection(connetionString);
string success = "false";
try
{
connection.Open();
oledbAdapter.InsertCommand = new OleDbCommand(sql, connection);
oledbAdapter.InsertCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
success = ex.ToString();
return success;
}
success = "true";
return success;
}
注意,我让应用程序在X86模式下运行,以避免ACE.OLEDB.12.0适配器出现错误 最突出的一点是,您从未关闭/处置您的SqlConnection。OLEDB数据适配器也是一次性的,应该弃置。“using”语句在这里是一种方便的构造:
public static string insertQuery(string sql)
{
string connetionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\Owner\Desktop\Arbeit\TrademarkParserproject1\TrademarkParserproject\bin\x86\Debug\Database.accdb";
using(var oledbAdapter = new OleDbDataAdapter())
using(var connection = new OleDbConnection(connetionString))
{
string success = "false";
try
{
connection.Open();
oledbAdapter.InsertCommand = new OleDbCommand(sql, connection);
oledbAdapter.InsertCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
success = ex.ToString();
return success;
}
success = "true";
return success;
}
}
最突出的一点是,您从不关闭/处置SqlConnection。OLEDB数据适配器也是一次性的,应该弃置。“using”语句在这里是一种方便的构造:
public static string insertQuery(string sql)
{
string connetionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\Owner\Desktop\Arbeit\TrademarkParserproject1\TrademarkParserproject\bin\x86\Debug\Database.accdb";
using(var oledbAdapter = new OleDbDataAdapter())
using(var connection = new OleDbConnection(connetionString))
{
string success = "false";
try
{
connection.Open();
oledbAdapter.InsertCommand = new OleDbCommand(sql, connection);
oledbAdapter.InsertCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
success = ex.ToString();
return success;
}
success = "true";
return success;
}
}
就这样!故障一定是由于同时打开了这么多个连接而没有处理它们造成的。非常感谢。就这样!故障一定是由于同时打开了这么多个连接而没有处理它们造成的。非常感谢。