2013-01-03 61 views
1

我有一些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; 
     } 
    } 
} 

} 
+0

我會建議做一個批量更新,而不是逐行更新。有一次我相信你超過了允許的最大連接數。 – dinukadev

+0

你打開/關閉連接的代碼在哪裏..?你是否打開和關閉每個事務的連接,當你正在執行UPDATE時,DBServer.ExecuteQuery是你自己的方法..? – MethodMan

+0

@DJ KRAZE請看我編輯的DBServer類,謝謝 – jomsk1e

回答

1

不要在每次迭代中實例化Command對象,也不要定義參數。你應該嘗試寫代碼如下東西:

string query = @"UPDATE bartran SET aNumberCounter = ? WHERE id = ?;"; 
    string [email protected]"Driver={{MySQL ODBC 5.1 Driver}};Server=localhost;dataBase=database_name;User=root;Password=;Option=3;"; 
    using(OdbcConnection connection=new OdbcConnection(cnstr)) 
    { 
    using(OdbcCommand cmd=new OdbcCommand(query,connection)) 
    { 
    cmd.Parameters.Add("?",OdbcType.Int); 
    cmd.Parameters.Add("?",OdbcType.Int); 
    connection.Open(); 
    for (int i = 0; i < dsData.Tables["data"].Rows.Count; i++) 
    { 
     ... 
     cmd.Parameters[0].Value=aNumberCounter; 
     cmd.Parameters[1].Value=id; 
     cmd.ExecuteNonQuery(); 
     } 
    connection.Close(); 
    } 
    } 

PS:你應該有使用MySql Provider API而不是Odbc API

+0

這是一個偉大的建議!我知道了!但是我得到了一個錯誤,初始化字符串的格式不符合從索引0開始的規範。 – jomsk1e

+0

在我初始化的行上OdbcConnection – jomsk1e

+0

你有'String.Format'方法的問題。請驗證方法參數和索引。 – adatapost

1

如果我是你,我會第一時間內環路準備我的查詢和循環一次後執行。這樣,您將避免在數據庫上進行多次往返。我在這裏有一個相同的想法,但使用VB.NET和其他數據庫類,而不是ODBC。

Dim Command As New SqlCommand(_ 
     "insert into hilmarc_cem_items " & _ 
     "(CEMID, " & _ 
     "ItemCode, " & _ 
     "UnitPrice, " & _ 
     "Quantity, " & _ 
     "UOM) ", Connection)  


Dim ItemCodes() As String = Request.Form.GetValues("ItemCode") 
Dim UnitPrices() As String = Request.Form.GetValues("UnitPrice") 
Dim Quantities() As String = Request.Form.GetValues("Quantity") 
Dim UOMs() As String = Request.Form.GetValues("UOM") 

'Prepare query, do not execute yet!' 
For Counter = 0 To ItemCodes.Length - 1 
    Command.CommandText &= "select @CEMID, @ItemCode" & Counter & ", @UnitPrice" & Counter & ", @Quantity" & Counter & ", @UOM" & Counter & " " 
    Command.Parameters.Add("@ItemCode" & Counter, Data.SqlDbType.NVarChar).Value = ItemCodes(Counter) 
    Command.Parameters.Add("@Quantity" & Counter, Data.SqlDbType.Decimal).Value = Quantities(Counter) 
    Command.Parameters.Add("@UOM" & Counter, Data.SqlDbType.NVarChar).Value = UOMs(Counter) 
    Command.Parameters.Add("@UnitPrice" & Counter, Data.SqlDbType.Decimal).Value = UnitPrices(Counter) 
    If Not Counter = ItemCodes.Length - 1 Then 
     Command.CommandText &= "union all " 
    Else 
     Command.CommandText &= ";" 
    End If 
Next 

'After the preparation, execute the query' 
Connection.Open() 
Command.ExecuteNonQuery() 

這個想法是有一個單一的查詢,從數組中獲取所有數據,並將它們添加到sqlCommand中作爲參數。循環之後,您將執行命令ONCE。該查詢將如下所示:

insert into myTable 
    (CEMID, 
    ItemCode, 
    UnitPrice, 
    Quantity, 
    UOM) 
select @CEMID, @ItemCode0, @UnitPrice0, @Quantity0, @UOM0 
union all 
select @CEMID, @ItemCode1, @UnitPrice1, @Quantity1, @UOM1 
union all 
select @CEMID, @ItemCode1, @UnitPrice1, @Quantity1, @UOM1 
union all 

上面的代碼,做批量插入,你可以改變它們來更新。

+0

感謝您的想法男人!這是非常有用的,雖然我標出了AVD的答案,因爲他舉了一個例子!但你的回答也給了我暗示感謝的人! – jomsk1e

+0

@JRC歡迎您!實際上,如果你願意,標記的答案可以被優化,看看我的編輯,我添加了我以前的工作,但它不是c#,並且不是ODBC。它會幫助你。 – dpp

相關問題