Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';在连续打开和关闭连接后,连接到本地主机上的MySql服务器_C#_Asp.net_Mysql_Sql - Fatal编程技术网

C# Can';在连续打开和关闭连接后,连接到本地主机上的MySql服务器

C# Can';在连续打开和关闭连接后,连接到本地主机上的MySql服务器,c#,asp.net,mysql,sql,C#,Asp.net,Mysql,Sql,我有一些mysql问题,我有一个名为“transactionNumber”和“counter”的列 transactionNumber值可以是这样的:(不包括字母) “计数器”列是一个字段,用于计算行中有多少transactionNumber。例如,上面字母“a”有2个交易编号,字母“b”有3个交易编号,等等。字母“d”计为1 但应用程序启动时计数器列为空。因此,我创建了一个方法,该方法将计算每行的transactionNUmber并更新计数器列 以下是我的方法: private void Tr

我有一些mysql问题,我有一个名为“transactionNumber”和“counter”的列

transactionNumber值可以是这样的:(不包括字母)

“计数器”列是一个字段,用于计算行中有多少transactionNumber。例如,上面字母“a”有2个交易编号,字母“b”有3个交易编号,等等。字母“d”计为1

但应用程序启动时计数器列为空。因此,我创建了一个方法,该方法将计算每行的transactionNUmber并更新计数器列

以下是我的方法:

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);
    }
}
所以我试着在这里为你们寻求帮助。如何根据页面加载时的计数计算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;
        }
    }
}

}
使用系统;
使用系统数据;
使用System.Data.Odbc;
公共静态类DBServer
{
//试验
private const string Server=“localhost”;
私有常量字符串Uid=“root”;
private const string Pwd=“defaultpass”;
//生活
//private const string Server=“ipaddress”;
//私有常量字符串Uid=“root”;
//private const string Pwd=“密码”;
公共静态数据表GetTable(字符串查询、字符串数据库)
{
使用(OdbcConnection cn=新的OdbcConnection)(
string.Format(“驱动程序={{MySQL ODBC 5.1驱动程序}};服务器={0};数据库={1};用户={2};密码={3};选项=3;”,
服务器、数据库、Uid、Pwd)
{
使用(OdbcCommand cmd=newodbccommand(query,cn))
{
DataTable dt=新的DataTable();
cn.Open();
使用(OdbcDataReader rdr=cmd.ExecuteReader())
{
dt.荷载(rdr);
返回dt;
}
}
}
}
公共静态数据表GetTable(字符串查询、字符串数据库、OdbcParameter[]参数)
{
使用(OdbcConnection cn=新的OdbcConnection)(
string.Format(“驱动程序={{MySQL ODBC 5.1驱动程序}};服务器={0};数据库={1};用户={2};密码={3};选项=3;”,
服务器、数据库、Uid、Pwd)
{
使用(OdbcCommand cmd=newodbccommand(query,cn))
{
if(参数!=null)
cmd.Parameters.AddRange(参数);
DataTable dt=新的DataTable();
cn.Open();
使用(OdbcDataReader rdr=cmd.ExecuteReader())
{
dt.荷载(rdr);
返回dt;
}
}
}
}
/// 
///执行对数据库的查询(参数化)
/// 
///查询字符串
///目标数据库
///参数集合
///受影响的记录数
公共静态int ExecuteQuery(字符串查询、字符串数据库、OdbcParameter[]参数)
{
使用(OdbcConnection cn=newODBCConnection(string.Format(“Driver={{MySQL ODBC 5.1 Driver}}};Server={0};database={1};User={2};Password={3};Option=3;”,
服务器、数据库、Uid、Pwd)
{
使用(OdbcCommand cmd=newodbccommand(query,cn))
{
if(参数!=null)
cmd.Parameters.AddRange(参数);
cn.Open();
返回cmd.ExecuteNonQuery();
}
}
}
/// 
///检查查询是否有记录(参数化)
/// 
///查询字符串
///目标数据库
///参数集合
///如果记录为false,则为true
公共静态bool HasRecord(字符串查询、字符串数据库、OdbcParameter[]参数)
{
使用(OdbcConnection cn=newODBCConnection(string.Format(“Driver={{MySQL ODBC 5.1 Driver}}};Server={0};database={1};User={2};Password={3};Option=3;”,
服务器、数据库、Uid、Pwd)
{
使用(OdbcCommand cmd=newodbccommand(query,cn))
{
if(参数!=null)
cmd.Parameters.AddRange(参数);
cn.Open();
使用(OdbcDataReader=cmd.ExecuteReader())
{
返回reader.HasRows;
}
}
}
}
/// 
///检查查询是否有记录
/// 
///查询字符串
///目标数据库
///如果记录为false,则为true
公共静态bool HasRecord(字符串查询、字符串数据库)
{
使用(OdbcConnection cn=newODBCConnection(string.Format(“Driver={{MySQL ODBC 5.1 Driver}}};Server={0};database={1};User={2};Password={3};Option=3;”,
服务器、数据库、Uid、Pwd)
{
使用(OdbcCommand cmd=newodbccommand(query,cn))
{
cn.Open();
使用(OdbcDataReader=cmd.ExecuteReader())
{
返回reader.HasRows;
}
}
}
}
公共静态数据表CallStoredProcess(字符串查询、字符串数据库、OdbcParameter[]参数)
{
使用(OdbcConnection cn=新的OdbcConnection)(
string.Format(“驱动程序={{MySQL ODBC 5.1驱动程序}};服务器={0};数据库={1};用户={2};密码={3};选项=3;”,
服务器、数据库、Uid、Pwd)
{
cn.Open();
使用(OdbcCommand cmd=newodbccommand(query,cn))
{
cmd.CommandType=CommandType.storedProcess;
if(参数!=null)
cmd.Parameters.AddRange(参数);
OdbcDataReader rdr=cmd.ExecuteReader();
DataTable dt=新的DataTable();
dt.荷载(rdr);
返回dt;
}
}
}
}

如果我是您,我将首先在循环中准备查询,然后在循环后执行一次。这样,您将避免在数据库上进行多次往返。我这里有一个例子,使用了相同的想法,但是使用了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中。循环完成后,将执行一次命令。查询如下所示:

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

如果要批量插入上述代码,可以将其更改为更新。

不要实例化
命令
对象,也不要在每次迭代中定义参数。你应该试着这样写代码
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()
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
   string query = @"UPDATE bartran SET aNumberCounter = ? WHERE id = ?;";
   string cnstr=@"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();
    }
   }