我的MSSQL数据访问管理器中存在此代码的问题。有时返回的记录不是预期的记录。 DataReader列来自好表,但字段似乎来自另一个请求。
当我在同一个表上同时获得大量请求时,会出现这种情况,结果如“选择A后退B,选择B返回D,选择C后退Z,......”这样的结果是无法实现的。
public bool Read(string ID)
{
bool _return = false;
System.Data.SqlClient.SqlConnection Connection = new System.Data.SqlClient.SqlConnection(ConnectionString);
try
{
string Query = "Select * From Sounds Where ID = '" + ID + "'";
System.Data.SqlClient.SqlDataReader DataReader;
using (System.Data.SqlClient.SqlCommand Command = new SqlCommand())
{
Command.Connection = Connection;
Command.CommandText = Query;
Connection.Open();
DataReader = Command.ExecuteReader();
}
if (DataReader.Read())
{
FillClass(DataReader);
_return = true;
}
else
{
_return = false;
}
if (! DataReader.IsClosed) DataReader.Close();
}
catch (Exception e)
{
_return = false;
}
finally
{
if ((Connection != null) && (Connection.State == ConnectionState.Open)) {
Connection.Close();
}
}
return _return;
}
我不明白SQL 2012返回错误记录或.Net CLR不匹配SQL管道......
感谢您的帮助。 -Alex
答案 0 :(得分:2)
你看到一个关于命令/结果不匹配的新的前所未见的问题,这是极不可能的;更有可能的是,您的代码只是出错了;首先要做的是简化(并解决很多问题):
public bool Read(string ID)
{
using(var connection = new SqlConnection(ConnectionString))
using (var command = connection.CreateCommand())
{
command.CommandText = "select * from Sounds where ID=@ID";
command.Parameters.AddWithValue("ID",ID);
Connection.Open();
using(var reader = command.ExecuteReader())
{
if(reader.Read()
{
FillClass(reader);
return true;
}
return false;
}
}
}
下一个有趣的问题是“FillClass
看起来像什么?”。
下一个有趣的问题是“调用代码是什么样的? - 您是否有可能只是错误地在请求之间共享状态,例如使用{ {1}}在网络应用程序中?“。
最后一个有趣的问题是:这可能只是使用dapper之类的东西(它简化了ADO.NET访问,参数化,并按列名自动映射属性/字段):
static
你写的代码越少,注入不必要的错误的可能性就越小......
答案 1 :(得分:0)
此部分应用程序中没有静态。此read方法是从数据库加载对象的基类的一部分。
我在我的应用程序中实现了您的代码并放在我的服务器上。问题仍然存在......
以下是调用数据库读取的代码的一部分:
public class program
{
public static Toolbox toolbox = new Toolbox();
public void main()
{
// ....
var Duration = toolbox.GetFileDuration(File);
// ...
}
//...
}
public class Toolbox
{
//....
public long GetFileDuration (string FileName){
Repository.dbSound Sound = new Repository.dbSound(ConnectionString);
if (Sound.Read(FileName))
{
return Sound.Duration;
}
else
{
return -1;
}
}
//....
}
另一方面,我在方法中添加日志记录以获取ID发送和在datareader中返回的ID,我在日志文件中得到了这个:
07920-04.mp3 - > Datareader.Read()失败了 07747-12.mp3 - > 07920-04.mp3
表格中存在两个文件!!!
感谢您的帮助。