.net SqlDataReader返回不正确的结果

.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

我的MSSQL数据访问管理器中存在此代码问题。有时返回的记录不是预期的记录。DataReader列来自good表,但字段似乎来自另一个请求
当我在同一个表上同时收到很多请求时,就会出现这种行为,结果更像是“选择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;
         }

    }

    //....

}