即使数据库中有数据,SqlCommand也会返回null

时间:2014-11-24 19:19:31

标签: c# winforms ado.net

我现在正在查看我的代码几个小时,而且我似乎无法找到错误。

实际问题是每当我运行查询时,它似乎都返回一个null类型,我确信数据库中还有数据。

给出错误:

An unhandled exception of type 'System.ArgumentNullException' occurred in System.Data.dll

Additional information: Value cannot be null.

我会粘贴我使用的一些代码。

App.Config中

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="MarkProject.Properties.Settings.MoviesConnectionString"
            connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\MoviesUML.mdf;Integrated Security=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

Database.cs(我自己的类从数据库中获取数据,只显示Select方法和我的连接字符串,因为它会给你带来麻烦)

连接字符串:

private string connectionString = ConfigurationManager.ConnectionStrings["MarkProject.Properties.Settings.MoviesConnectionString"].ConnectionString;

选择方法:

public DataTable Select(string query, Dictionary<string, object> values = null)
{
    using(SqlConnection myConnection = new SqlConnection(connectionString))
    {
        using(SqlCommand cmd = new SqlCommand(query, myConnection))
        {
            myConnection.Open();

            if(values != null)
            {
                foreach(var item in values)
                {
                    cmd.Parameters.AddWithValue("@" + item.Key, item.Value);
                }
            }

            this._dataAdapter = new SqlDataAdapter(cmd);
            this._dataAdapter.Fill(this._dataTable);

            myConnection.Close();
        }
    }

    return this._dataTable;
}

我正在运行的查询会产生错误。

DataTable movieData = this._db.Select("SELECT Title, Year FROM Movie");

这是证明该表实际已填充的证据。

Proof of data in database

2 个答案:

答案 0 :(得分:2)

这是一种非常常见的情况。它总是误解了| DataDirectory |的含义在WinForms应用程序中。在Visual Studio中调试应用程序时,substitution string |DataDirectory|指向BIN \ DEBUG文件夹(或x86变体)。因此,所有命令都针对位于该文件夹中的数据库运行。通常这会导致INSERT,UPDATE或DELETE操作出现问题,但如果两个数据库包含不同的数据,则SELECT也会受到影响。

要解决此问题,请从BIN \ DEBUG文件夹中的项目文件夹中复制MDF文件,然后在服务器资源管理器中创建第二个连接。这个指向BIN \ DEBUG文件夹中的数据库文件,并使用它来检查命令是否有效。

答案 1 :(得分:1)

public DataTable Select(string query, Dictionary<string, object> values = null)
{
    using(SqlConnection myConnection = new SqlConnection(connectionString))
    {
        using(SqlCommand cmd = new SqlCommand(query, myConnection))
        {
            myConnection.Open();

            if(values != null)
            {
                foreach(var item in values)
                {
                    cmd.Parameters.AddWithValue("@" + item.Key, item.Value);
                }
            }

            cmd.CommandType = CommandType.Text;
            sda = new SqlDataAdapter(cmd);
            dt = new DataTable("YourDataTable");
            new SqlDataAdapter(cmd).Fill(dt);            
        }
    }
    return dt
}