动态数据源路径C#

时间:2016-10-24 17:37:13

标签: c# database

我创建了一个应用程序,其中组合框与Access数据库绑定。应用程序在我的计算机上工作正常,因为我定义的连接字符串中的源路径与我的计算机有关。我将项目文件夹复制到另一台计算机,该计算机在指定位置找不到数据库时出错。

我可以动态设置文本框或其他输入的路径吗?我可以从源路径无关紧要的应用程序中调用数据库。即使我引用Resources.Database1,它仍然提供了我的计算机的应用程序文件夹的完整路径,该文件夹不能在另一台计算机上运行。任何想法将不胜感激。谢谢!

我的代码如下:

private void button1_Click(object sender, EventArgs e)
{
    OleDbCommand command = new OleDbCommand();
    command.CommandType = CommandType.Text;
    command.CommandText = "INSERT INTO SubrubDatabaseT(SuburbName,DeliveryTime) values('" + textBox1.Text + "','" + textBox2.Text + "')";
    OleDbConnection connect = new OleDbConnection();
    connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\WoolsValley\Desktop\Database1.accdb ;
    Persist Security Info = False; ";
    connect.Open();
    command.Connection = connect;
    command.ExecuteNonQuery();
    MessageBox.Show("Data Saved Successfully");
    connect.Close();   
}

3 个答案:

答案 0 :(得分:0)

对于您的情况,解决方案是使用App.config(或Web.config,具体取决于您正在开发的项目的类型)文件并将所有设置放在那里。然后,如果路径不存在,您仍然可以将其更改为此文件中的现有路径,并且无需重新编译该应用程序。

这是这些lind文件的主要用途,添加任何可能在用户计算机上更改的设置或应用程序发布时可能需要很少调整的设置,如本例所示,可能不需要为应用程序运行的每台计算机重新编译。

答案 1 :(得分:0)

正如您自己提到的,您可以只使用文件路径的文本框,也可以选择OpenFileDialog组件来选择文件。然后在连接字符串中传递它:

//GetFileSource() a method that gets the source from somewhere, like a textbox or a configuration entry in app.config.
var fileSource = GetFileSource(); 
connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileSource + ";Persist Security Info = False;";

同样重要的是确保文件确实存在于目的地。

答案 2 :(得分:0)

您可以创建一种方法,在users文件夹中搜索数据文件,或让用户在启动时指定数据文件并将其保存到用户配置文件目录。有很多方法可以做到这一点,你选择哪种方式取决于如何将数据文件复制到用户PC,是否有许多数据文件等因素。

如果数据文件仅与应用程序一起存在,则只能有一个数据文件,并且在部署时(即运行MSI 时)复制/创建数据文件然后放入它在app.config中而不是作为连接元素。见Connection Strings and Configuration Files.

首先要始终使用参数化查询。见https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters(v=vs.110).aspx

  

说明

     

当CommandType设置为Text时,OLE DB .NET提供程序不支持将参数传递给SQL语句或OleDbCommand调用的存储过程的命名参数。在这种情况下,必须使用问号(?)占位符。

您的代码使用using语句和参数化输入重构。

// get file from the drop down
var filePath = getSelectedDataFile();

using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath))
using (OleDbCommand cmd = new OleDbCommand())
{
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "INSERT INTO SubrubDatabaseT(SuburbName,DeliveryTime) values(?,?)"; 

    cmd.Parameters.Add(new OleDbParameter("@suburbName", OleDbType.VarChar)).Value = textBox1.Text;
    cmd.Parameters.Add(new OleDbParameter("@deliveryTime", OleDbType.VarChar)).Value = textBox2.Text;

    con.Open();
    cmd.ExecuteNonQuery();
}

请注意:

  • OleConnection和OleDbCommand包含在using块中,因此即使发生异常也会对它们进行处理/清理。
  • 现在使用参数而不是硬编码字符串值
  • 参数使用正确的数据类型