【问题标题】:How to read Xml file before execute Form_Load?如何在执行 Form_Load 之前读取 Xml 文件?
【发布时间】:2017-01-01 12:00:07
【问题描述】:

我有一个 C# 应用程序并使用 xml 文件将连接字符串设置为我的 sql 数据库。数据库用 tableadapter 填充 datagridviews。我希望在填充 datagridview 之前设置连接字符串,因为我有 DataGridView 的 CellValueChanged 事件。

我现在代表 From_Load 的代码是:

xmldoc.Load("D:\\XML\\paths.xml");
            XmlNode node = xmldoc.DocumentElement.SelectSingleNode("/paths/sqlconnection");
            sqlconnect = node.InnerText;
            cn = new SqlCeConnection("Data Source=" + sqlconnect);


            // TODO: Diese Codezeile lädt Daten in die Tabelle "database1DataSet.Raum". Sie können sie bei Bedarf verschieben oder entfernen.
            this.raumTableAdapter1.Fill(this.database1DataSet.Raum);
            // TODO: Diese Codezeile lädt Daten in die Tabelle "database1DataSet.Firma". Sie können sie bei Bedarf verschieben oder entfernen.
            this.firmaTableAdapter1.Fill(this.database1DataSet.Firma);
            // TODO: Diese Codezeile lädt Daten in die Tabelle "database1DataSet.Kunde". Sie können sie bei Bedarf verschieben oder entfernen.
            this.kundeTableAdapter1.Fill(this.database1DataSet.Kunde);
            // TODO: Diese Codezeile lädt Daten in die Tabelle "database1DataSet.Ansprechperson". Sie können sie bei Bedarf verschieben oder entfernen.
            this.ansprechpersonTableAdapter1.Fill(this.database1DataSet.Ansprechperson);

但我收到一个错误,即在 CellValueChanged 时未设置连接字符串。

我的 XML 文件是这样设置的:

<?xml version="1.0" encoding="UTF-8"?>
- <paths>
    <sqlconnection>D:\\BDTWelcome - Kopie 2.0 fixed\\BDTWelcome\\Database1.sdf</sqlconnection>
    <ExcelVorlagen>D:\\BröExcelVorlagen</ExcelVorlagen>
  </paths>

如果你能告诉我我的错误在哪里,那就太棒了。

【问题讨论】:

  • 你在哪里打开你的连接?
  • 如果你知道表单加载之前的xml文件路径,你可以尝试在构造函数中加载相同的xml而不是在表单加载中?
  • 我在执行 sql 请求之前打开了与数据库的连接
  • 好的,但这不是您上面代码中的内容。您设置连接,然后尝试用适配器填充您的表。您的数据集从哪里得知正确的连接?
  • 我现在确实设置了数据集的连接字符串,但错误仍然相同,似乎在表格适配器填充数据网格视图之前已经填充了它,因为如果我将进程记录在文件它甚至没有进入表单加载。

标签: c# sql xml winforms visual-studio-2010


【解决方案1】:

转到您的 winfows 表单项目的 Programm.cs 文件。它看起来像:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

相关部分是Main()的最后一行。在这里创建了表单。您需要在调用表单的构造函数之前加载您的 XML 文件。可能的代码如下所示:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    xmldoc.Load("D:\\XML\\paths.xml");
        XmlNode node = xmldoc.DocumentElement.SelectSingleNode("/paths/sqlconnection");
        sqlconnect = node.InnerText;
        cn = new SqlCeConnection("Data Source=" + sqlconnect);

    Application.Run(new Form1(XmlNode));
}

通过它的构造函数将加载的 XmlNode(或任何你想要的)传递给表单。因此,您必须在 Form1.designer.cs 文件中添加一个构造函数并处理传递的数据。

【讨论】:

  • 我仍然遇到同样的错误。也许是因为我在 Form.cs 中再次初始化了连接?
  • 这不是一个好习惯,我更喜欢处理导致问题的单元格更改事件。
  • @MarcelTheis 我在 cellValueChanged 事件中打开了连接,此时它给了我连接字符串未设置的错误。
  • 好的,但为时已晚,因为数据集必须在填充单元格之前填充,对吧?!?
【解决方案2】:

我有一个程序做的几乎一样。我这样建立我的连接:

/// <summary>
    /// Datenbank wird geöffnet.
    /// </summary>
    /// <param name="sCon">Verbindungsstring.</param>
    /// <returns>Erfolgreich?</returns>
    public bool OpenDBConnect(string sCon)
    {
        bool bOK = false;

        try
        {
            _conn = new SqlConnection(sCon);
            _sConn = sCon;
            _conn.Open();
            bOK = true;
        }
        catch (Exception ex)
        {
            _Logger.Log(Properties.EnglishStringResource.ConnectionFailed + ex.Message);                
            bOK = false;
        }
        return bOK;
    }


之后,您当然必须告诉您的数据集使用此连接,否则数据集中将没有数据,您将收到未为您的数据集设置连接字符串的错误!它想要更改网格中的数据(因为您可能将其绑定到网格),但由于缺少连接而无法获取任何数据。

设置设计师制作的数据集的连接字符串可以这样完成:

[ApplicationNamespace].Properties.Settings.Default["ConnectionString"] = newconstr;

【讨论】:

  • 好的,这对我来说似乎是正确的方式,但是,我如何告诉数据集使用这个连接?
  • 这取决于如何设置数据集的连接。设置中有连接字符串吗?
【解决方案3】:

对我有用的解决方案是简单地创建一个函数来读取 xlm 文件并在第一次使用连接字符串之前设置连接字符串。

public void readconnectionstring()
        {
            xmldoc.Load("D:\\XML\\paths.xml");
            XmlNode node = xmldoc.DocumentElement.SelectSingleNode("/paths/sqlconnection");
            sqlconnect = node.InnerText;
            cn = new SqlCeConnection("Data Source=" + sqlconnect);
        }

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多