OpenFileDialog 仅在数据库查询后循环应用

OpenFileDialog loop application only after a DB query

我遇到了困难:

这是我的表格:

第一个按钮“...”是 btnAllegato。代码:

        private void btnAllegato_Click(object sender, EventArgs e)
    {

        try
        {

            using (OpenFileDialog openFileDialog1 = new OpenFileDialog())
            {
                string path = string.Empty;

                openFileDialog1.Title = "Seleziona richiestaIT (PDF)..";
                openFileDialog1.Filter = ("PDF (.pdf)|*.pdf");
                openFileDialog1.FilterIndex = 1;
                openFileDialog1.FileName = "";


                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {

                    //salva l'intero path
                    path = openFileDialog1.FileName;

                    //nome file + estensione
                    string temp = openFileDialog1.SafeFileName;

                    //elimina l'estensione del file con IgnoreCase -> case Unsensitive
                    temp = Regex.Replace(temp, ".pdf", " ", RegexOptions.IgnoreCase);

                    //datatime + replace
                    string timenow = System.DateTime.Now.ToString();

                    //replace data da gg//mm/aaaa  ss:mm:hh  ----->  ad   gg-mm-aaaa_ss-mm-hh  
                    timenow = timenow.Replace(":", "-").Replace("/", "-");//.Replace(" ", " ");     

                    _url = @"\192.168.5.7\dati\SGI\GESTIONE IT\RichiesteIT\" + temp + timenow + ".pdf";

                    System.IO.File.Copy(path, _url);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

在我有一个 Inserisci 按钮之后 >> (btnInserisci) 使用此按钮我创建一个数据库查询以插入数据...

private void btnInserisci_Click(object sender, EventArgs e)
{
    try
    {
        if ((_IDRichiedente != -1) && (_data != string.Empty) && (_url != string.Empty))
        {
            MessageBox.Show(_url);
            QueryAssist qa = new QueryAssist();
            string query = "INSERT INTO RICHIESTA_IT(ID_Risorsa, descrizione_richiesta, modulo_pdf, data_richiesta) VALUES('" + _IDRichiedente + "', '" + txtBreveDescrizione.Text + "', '" + _url + "', '" + _data + "');";
            MessageBox.Show(query);

            qa.runQuery(query);

        else
        {
            MessageBox.Show("Selezionare il richiedente,data o allegato!");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

}

其中

private int _IDRichiedente = -1;
private string _data = String.Empty;
private string _url = string.Empty;

是class的字段。

QueryAssist 是我的 class 连接,运行 查询和断开连接到 Access 数据库。

代码:

    class QueryAssist
{
    System.Data.OleDb.OleDbConnection _OleDBconnection;

    public QueryAssist()
    {
        this._OleDBconnection = null;
    }



    private bool connectionDB()
    {

        string connection = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\"\\192.168.5.7\dati\Scambio\Sviluppo\Impostazioni temporanea db Censimento\CensimentoIT.accdb\"";
        try
        {
            _OleDBconnection = new System.Data.OleDb.OleDbConnection(connection);
            _OleDBconnection.Open();
            return true;

        }
        catch(Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
            return false;
        }
    }



    private void disconnectDB()
    {
        try
        {
            _OleDBconnection.Close();
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);

        }
    }



    public System.Data.DataTable runQuery(string query)
    {
        try
        {
            if (connectionDB())
            {
                System.Data.DataTable dataTable = new System.Data.DataTable();
                System.Data.OleDb.OleDbCommand sqlQuery = new System.Data.OleDb.OleDbCommand(query, _OleDBconnection);
                System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(sqlQuery);
                adapter.Fill(dataTable);
                disconnectDB();
                return dataTable;
            }
        }
        catch(Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
        }
        return null;

    }



    public int countRowsQueryResult(string query)
    {
        try
        {
            if (connectionDB())
            {
                System.Data.DataTable dataTable = new System.Data.DataTable();
                System.Data.OleDb.OleDbCommand sqlQuery = new System.Data.OleDb.OleDbCommand(query, _OleDBconnection);
                System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(sqlQuery);
                adapter.Fill(dataTable);
                disconnectDB();
                return dataTable.Rows.Count;
            }
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
        }
        return -1;

    }
}

第一次...应用程序运行良好。我选择了一个文件和其他数据,然后单击按钮 'Inserisci>>',一切正常。

当我想插入其他数据时的下一步...当我单击“...”按钮附加文件时,我有循环 OpenFileDialog

要关闭,我必须终止进程。 我在程序的主要部分设置了 [STAThread]。 连接到 NAS 不是问题...我在本地尝试过..我也有同样的问题..

如果我点击 btn '...' 到 OpenFileDialg 然后不点击按钮 'Inserisci>>' OpenFileDialog 一直都很好用...

但是,如果我单击按钮 'Inserisci>>',然后单击按钮“...”进入 OpenFileDialog 应用程序循环。

抱歉英语不好..我来这里是为了澄清

将 runQuery 方法与 INSERT 语句一起使用可能是您遇到问题的原因。要插入记录,您应该使用带有 ExecuteNonQuery 的 OleDbCommand。 Fill 方法用于填充 DataTable。

无论如何都会插入记录,因为用于填充 DataTable (ExecuteReader) 的底层命令会忽略其 sql 命令文本并执行您传递的内容。但是,在此之后,Fill 方法需要填充 DataTable 并且没有 select 语句可能是导致问题的潜在原因。

当您需要 Update/Delete 或插入新数据时,我会使用不同的方法

public int runNonQuery(string query)
{
    try
    {
        if (connectionDB())
        {
            OleDbCommand sqlQuery = new OleDbCommand(query, _OleDBconnection);
            int rows = sqlQuery.ExecuteNonQuery();
            disconnectDB();
            return rows;
        }
    }
    catch(Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
        return -1;
    }
}

您的代码中还有其他问题,并且都与您将字符串连接在一起形成 sql 语句的方式有关。这被认为是数据库代码可能出现的最糟糕的做法。如果您花一点时间研究如何编写参数化查询,您将避免很多未来的问题。