动态数据源路径c#

本文关键字:路径 数据源 动态 | 更新日期: 2023-09-27 18:14:35

我创建了一个应用程序,其中一个组合框与Access数据库绑定。应用程序在我的计算机上运行良好,因为我定义的connectionstring中的源路径与我的计算机相关。我将项目文件夹复制到另一台计算机上,在指定位置找不到数据库。

我可以从文本框或其他输入动态设置路径吗?我可以从源路径无关紧要的应用程序调用数据库吗?即使当我提到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();   
}

动态数据源路径c#

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

这是这组文件的主要用途,用于添加在用户机器上或应用程序发布时可能更改的任何设置,并且可能需要少量调整,就像在本例中一样,并且可能不需要为应用程序运行的每台计算机重新编译。

正如您自己提到的,您可以简单地使用文本框来表示文件路径,或者使用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;";

同样重要的是,您要确保目标文件确实存在。

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

如果数据文件仅与应用一起存在,则只有一个数据文件,并且该数据文件在部署时被复制/创建(即。当你运行MSI时,把它作为一个连接元素放在app.config中。参考连接字符串和配置文件

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

评论

当CommandType设置为Text时,OLE DB . net Provider不支持将参数传递给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块中,因此即使发生异常也会被处理/清理。
  • 参数现在使用,而不是硬编码字符串值
  • 参数使用正确的数据类型