0

我的 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 管道不匹配...

感谢您的帮助。-亚历克斯

4

2 回答 2

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看起来像什么?”。

一个有趣的问题是“调用代码是什么样的? - 有没有可能只是在请求之间错误地共享状态,例如通过static在 Web 应用程序中使用?”。

最后一个有趣的问题是:这是否可以只使用dapper之类的东西(它简化了 ADO.NET 访问、参数化并按列名自动映射属性/字段):

Foo GetFoo(string id)
{
    using(var connection = new SqlConnection(ConnectionString))
    {
        return connection.Query<Foo>(
            "select * from Sounds where ID=@id", new { id }).SingleOrDefault();
    }
}

你写的代码越少,注入不必要的错误的机会就越少......

于 2013-06-24T09:26:32.660 回答
0

应用程序的这一部分没有静态。此读取方法是从数据库加载对象的基类的一部分。

我在我的应用程序中实现了你的一段代码并放在我的服务器上。问题依旧...

这是调用读取数据库的代码的一部分:

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 发送和数据读取器中返回的 ID,我在日志文件中得到了这个:

07920-04.mp3 --> Datareader.Read() 失败
07747-12.mp3 --> 07920-04.mp3

两个文件都存在于表中!!!

感谢您的帮助。

于 2013-06-25T09:02:03.403 回答