无法从解决方案资源管理器DataBase填充DataGridView

时间:2014-01-05 14:42:44

标签: c# sql-server winforms dataset

问题背景:

我开发了一个WinForm应用程序,现在正处于希望发布它的阶段。

我有一个SQL服务器数据库,我已将其添加到解决方案资源管理器的文件夹中,因为我希望数据库部署在应用程序中,如图所示;

enter image description here

在这个DataSet中,我添加了许多存储过程。

问题:

当我调试应用程序时,在代码段中提供以下连接字符串时,DataGridView 已填充。

string connectionString = @"Data Source=.;Integrated Security=True;AttachDbFilename=|DataDirectory|\testDB.mdf";**

public override DataSet FillDataGrid()
{

    SqlConnection connection = new SqlConnection(connectionString);
    SqlDataAdapter dataadapter = new SqlDataAdapter("spListAll", connection);
    DataSet ds = new DataSet();
    connection.Open();
    dataadapter.Fill(ds, "results");
    connection.Close();

    int size = ds.Tables[0].Rows.Count;

    return ds;
}

如果我使用连接字符串从我的机器上本地存储的数据库提供连接字符串,如下所示,它可以很好地填充网格。

string connectionString = @"Data Source=DAVE-PC\FINAWARE; Initial Catalog=testDB; Integrated Security=SSPI;";

任何人都可以告诉我应该如何正确设置它,以便我可以在解决方案资源管理器文件夹中使用testDB.mdf吗?

2 个答案:

答案 0 :(得分:0)

显然您的数据源无效。

其他人遇到与您相同的问题,并使用.\SQLEXPRESS作为数据源。

似乎您还需要在连接字符串more documentation

中添加User Instance = true

此处针对类似问题How do I connect to an MDF database file?

答案 1 :(得分:0)

当然我假设,无论您运行该应用程序的机器是什么,以前都安装了SQL Server。 (或者至少你有installed the LOCALDB版本的Sql Express 2012)

说,您应该记住, DataDirectory 替换字符串会根据您的应用运行位置以不同方式解析。

在Visual Studio(Winforms应用程序)下的调试会话中,DataDirectory解析为PROJECTFOLDER \ BIN \ DEBUG,数据库文件应该在那里(为了确保这一点,您可以将MDF文件Copy To The Output Directory的属性设置为Copy Always or If Newer

在生产机器中,DataDirectory(总是用于winforms应用程序)位于安装应用程序的同一文件夹中,如果您将应用程序安装在特殊的只读文件夹中,这对于数据库应用程序来说是个明显的问题。 C:\program files (x86)

幸运的是,可以更改DataDirectory替换字符串的位置。在尝试使用任何与数据访问相关的代码之前,请添加以下行

string dataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
dataPath = Path.Combiner(dataPath, "MyAppDataFolder");
AppDomain.CurrentDomain.SetData("DataDirectory", dataPath);

通常安装包应在MyAppDataFolder文件夹中创建CommonApplicationData并在那里复制MDF文件。建议这样做,因为您具有读/写权限,同一台计算机的其他用户可以使用您的应用程序

作为旁注,我看到了如何调用存储过程的另一个问题(虽然我无法解释为什么它可以在你更改连接字符串时起作用)。您应该告诉适配器您正在使用存储过程设置

SqlDataAdapter dataadapter = new SqlDataAdapter("spListAll", connection);
dataadapter.SelectCommand.CommandType = CommandType.StoredProcedure;