.net SqlDataReader返回不正确的结果
我的MSSQL数据访问管理器中存在此代码问题。有时返回的记录不是预期的记录。DataReader列来自good表,但字段似乎来自另一个请求.net SqlDataReader返回不正确的结果,.net,sql,sqldatareader,.net,Sql,Sqldatareader,我的MSSQL数据访问管理器中存在此代码问题。有时返回的记录不是预期的记录。DataReader列来自good表,但字段似乎来自另一个请求 当我在同一个表上同时收到很多请求时,就会出现这种行为,结果更像是“选择A重新运行B,选择B返回D,选择C重新运行Z,…” public bool Read(string ID) { bool _return = false; System.Data.SqlClient.SqlConnection Connecti
当我在同一个表上同时收到很多请求时,就会出现这种行为,结果更像是“选择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在命令/结果不匹配方面,您不太可能看到以前从未见过的新问题;更有可能的是,您的代码只是出了点问题;首先要做的是简化(并解决许多问题): 下一个有趣的问题是“FillClass看起来像什么?” 下一个有趣的问题是“调用代码是什么样子的?”——是否有可能只是在请求之间错误地共享状态,例如在web应用程序中使用
static
最后一个有趣的问题是:这是否可以使用以下内容(简化ADO.NET访问、参数化并按列名自动映射属性/字段):
Foo-GetFoo(字符串id)
{
使用(var连接=新的SqlConnection(ConnectionString))
{
返回连接。查询(
“从ID=@ID的声音中选择*”,新的{ID});
}
}
您编写的代码越少,插入不必要错误的机会就越小……应用程序的这一部分没有静态代码。此读取方法是从数据库加载对象的基类的一部分 我在我的应用程序中实现了您的一段代码,并将其放在我的服务器上。问题仍然存在 下面是调用数据库读取的部分代码:
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;
}
}
//....
}
另一方面,我在方法中添加了日志记录,以在datareader中获取发送的ID和返回的ID,我在日志文件中得到了以下信息:
07920-04.mp3-->数据读取器.Read()失败07747-12.mp3-->07920-04.mp3 这两个文件都存在于表中
感谢您的帮助。首先要解决的问题是:a)使用参数化SQL;b) 停止吞咽异常而不报告它们;c) 停止捕捉裸露的
异常
;d) 使用using
语句来处理连接、命令和读卡器。调用if(DataReader.Read())
将读卡器提前到1条记录。然后调用FillClass(DataReader)代码>。如果在FillClass
中再次调用DataReader.Read()
,将丢失第一条记录。检查你没有这个错误。我很想看看这里的调用代码是什么样子;我想知道问题是否出在调用者(即共享状态)而不是数据访问中,FillClass方法只是将datareader内容加载到派生类poperties的绑定方法(即this.foo=datareader(“foo”))
Foo GetFoo(string id)
{
using(var connection = new SqlConnection(ConnectionString))
{
return connection.Query<Foo>(
"select * from Sounds where ID=@id", new { id }).SingleOrDefault();
}
}
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;
}
}
//....
}