2013-01-03 59 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

相关问题