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 语句的方式有关。这被认为是数据库代码可能出现的最糟糕的做法。如果您花一点时间研究如何编写参数化查询,您将避免很多未来的问题。
我遇到了困难:
这是我的表格:
第一个按钮“...”是 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 语句的方式有关。这被认为是数据库代码可能出现的最糟糕的做法。如果您花一点时间研究如何编写参数化查询,您将避免很多未来的问题。