我现在正在查看我的代码几个小时,而且我似乎无法找到错误。
实际问题是每当我运行查询时,它似乎都返回一个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");
这是证明该表实际已填充的证据。
答案 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
}