我有一些mysql問題,我有一個名爲'transactionNumber'和'counter'的列。可以在連接打開和關閉連接後連接到本地主機上的MySql服務器
transactionNumber值可以是這樣的:(字母不包括在內)
a. 12345, 1234566
b. 9876, 98332, 23423
c. 12347
d. -
「反」列是計算有多少transactionNumber連續的字段。例如上面的字母'a'有2個transactionNumber,字母'b'有3個字母'd'計爲1.
但是當應用程序啓動時,counter列是空的。所以我創建了一個方法來計算每行的transactionNUMB並更新計數器列。
這裏是我的方法:
private void TransactionNumberCounter(DataSet dsData)
{
for (int i = 0; i < dsData.Tables["data"].Rows.Count; i++)
{
DataRow dRow = dsData.Tables["data"].Rows[i];
string tNumber = dRow.ItemArray.GetValue(1).ToString();
string id = dRow.ItemArray.GetValue(0).ToString();
string[] numbers = tNumbers.Split(',');
char[] arr = new char[] { '\t', '\n' };
int tNumberCounter= 0;
List<string> listAccNumbers = new List<string>();
foreach (string number in numbers)
listAccNumbers.Add(number.TrimStart(arr));
tNumberCounter = listAccNumbers.Count;
string query = @"UPDATE bartran SET aNumberCounter = ? WHERE id = ?;";
OdbcParameter[] parameters = new OdbcParameter[]{
new OdbcParameter("?", aNumberCounter),
new OdbcParameter("?", id)
};
DBServer.ExecuteQuery(query, "database_name", parameters);
}
}
此方法效果。但如果有行萬到伯爵是我得到一個錯誤:
Can't connect to MySQL server on "localhost" (10061)"
所以我嘗試在這裏尋求幫助你們。我如何計算t.Number和更新計數器字段基於頁面加載計數。提前致謝!
可能有效的其他方法?
EDIT:
這裏的DBSERVER類:
using System;
using System.Data;
using System.Data.Odbc;
public static class DBServer
{
//Test
private const string Server = "localhost";
private const string Uid = "root";
private const string Pwd = "defaultpass";
//LIVE
//private const string Server = "ipaddress";
//private const string Uid = "root";
//private const string Pwd = "password";
public static DataTable GetTable(string query, string database)
{
using (OdbcConnection cn = new OdbcConnection(
string.Format("Driver={{MySQL ODBC 5.1 Driver}};Server={0};dataBase={1};User={2};Password={3};Option=3;",
Server, database, Uid, Pwd)))
{
using (OdbcCommand cmd = new OdbcCommand(query, cn))
{
DataTable dt = new DataTable();
cn.Open();
using (OdbcDataReader rdr = cmd.ExecuteReader())
{
dt.Load(rdr);
return dt;
}
}
}
}
public static DataTable GetTable(string query, string database, OdbcParameter[] parameters)
{
using (OdbcConnection cn = new OdbcConnection(
string.Format("Driver={{MySQL ODBC 5.1 Driver}};Server={0};database={1};User={2};Password={3};Option=3;",
Server, database, Uid, Pwd)))
{
using (OdbcCommand cmd = new OdbcCommand(query, cn))
{
if (parameters != null)
cmd.Parameters.AddRange(parameters);
DataTable dt = new DataTable();
cn.Open();
using (OdbcDataReader rdr = cmd.ExecuteReader())
{
dt.Load(rdr);
return dt;
}
}
}
}
/// <summary>
/// Executes query to the database (Parameterized)
/// </summary>
/// <param name="query">Query String</param>
/// <param name="database">Target Database</param>
/// <param name="parameters">Collection of parameters</param>
/// <returns>Number of affected records</returns>
public static int ExecuteQuery(string query, string database, OdbcParameter[] parameters)
{
using (OdbcConnection cn = new OdbcConnection(string.Format("Driver={{MySQL ODBC 5.1 Driver}};Server={0};database={1};User={2};Password={3};Option=3;",
Server, database, Uid, Pwd)))
{
using (OdbcCommand cmd = new OdbcCommand(query,cn))
{
if (parameters != null)
cmd.Parameters.AddRange(parameters);
cn.Open();
return cmd.ExecuteNonQuery();
}
}
}
/// <summary>
/// Check if the query has record (Parameterized)
/// </summary>
/// <param name="query">Query string</param>
/// <param name="database">Target database</param>
/// <param name="parameters">Collection of parameters</param>
/// <returns>true if has record else false</returns>
public static bool HasRecord(string query, string database, OdbcParameter[] parameters)
{
using (OdbcConnection cn = new OdbcConnection(string.Format("Driver={{MySQL ODBC 5.1 Driver}};Server={0};database={1};User={2};Password={3};Option=3;",
Server, database, Uid, Pwd)))
{
using (OdbcCommand cmd = new OdbcCommand(query,cn))
{
if (parameters != null)
cmd.Parameters.AddRange(parameters);
cn.Open();
using (OdbcDataReader reader = cmd.ExecuteReader())
{
return reader.HasRows;
}
}
}
}
/// <summary>
/// Check if the query has record
/// </summary>
/// <param name="query">Query string</param>
/// <param name="database">Target database</param>
/// <returns>true if has record else false</returns>
public static bool HasRecord(string query, string database)
{
using (OdbcConnection cn = new OdbcConnection(string.Format("Driver={{MySQL ODBC 5.1 Driver}};Server={0};database={1};User={2};Password={3};Option=3;",
Server, database, Uid, Pwd)))
{
using (OdbcCommand cmd = new OdbcCommand(query, cn))
{
cn.Open();
using (OdbcDataReader reader = cmd.ExecuteReader())
{
return reader.HasRows;
}
}
}
}
public static DataTable CallStoredProcedure(string query, string database, OdbcParameter[] parameters)
{
using (OdbcConnection cn = new OdbcConnection(
string.Format("Driver={{MySQL ODBC 5.1 Driver}};Server={0};database={1};User={2};Password={3};Option=3;",
Server, database, Uid, Pwd)))
{
cn.Open();
using (OdbcCommand cmd = new OdbcCommand(query, cn))
{
cmd.CommandType = CommandType.StoredProcedure;
if (parameters != null)
cmd.Parameters.AddRange(parameters);
OdbcDataReader rdr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(rdr);
return dt;
}
}
}
}
我會建議做一個批量更新,而不是逐行更新。有一次我相信你超過了允許的最大連接數。 – dinukadev
你打開/關閉連接的代碼在哪裏..?你是否打開和關閉每個事務的連接,當你正在執行UPDATE時,DBServer.ExecuteQuery是你自己的方法..? – MethodMan
@DJ KRAZE請看我編輯的DBServer類,謝謝 – jomsk1e