SqlDataReader返回不正确的结果

时间:2013-06-24 09:15:10

标签: .net sql sqldatareader

我的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

2 个答案:

答案 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

表格中存在两个文件!!!

感谢您的帮助。