0

誰かが私に何が問題なのか教えてもらえますか?

設定:

dbConnectionString = "Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\data\db.mdf;Initial Catalog=db;Integrated Security=True"

クラス db.cs :

public SqlConnection conn = new SqlConnection(Properties.Settings.Default.dbConnectionString);

public object insert(String[] inserts, String table)
    {
        string query        = "INSERT INTO "+table+"";
        int dim             = inserts.Length;
        string[] valores    = new String[dim];
        string[] campos     = new String[dim];
        string camposItems  = "(";
        string valoresItems = "(";

        for (int i = 0; i <= dim - 1; i++)
        {
            string[] item = inserts[i].Split('=');
            if (i > 0)
            {
                campos[i]     = item[0];
                valores[i]    = item[1];
                camposItems  += ","+item[0];
                valoresItems += ",@"+item[0];
            }
            else
            {
                campos[i]     = item[0];
                valores[i]    = item[1];
                camposItems  += item[0];
                valoresItems += "@"+item[0];
            }
        }
        camposItems += ")";
        valoresItems += ")";
        query += camposItems+" VALUES "+valoresItems;
        query += "";

        try
        {
            using (this.conn)
            {
                SqlCommand cmdIns = new SqlCommand(query, this.conn);
                int ix = 0;
                string[] vals = new String[valores.Length];
                foreach (string val in valores)
                {
                    vals[ix] = val;
                    SqlParameter parameter = new SqlParameter();
                    parameter.ParameterName = "@" + campos[ix];
                    parameter.SqlDbType = SqlDbType.NVarChar;
                    parameter.Direction = ParameterDirection.Input;
                    parameter.Value = val;
                    cmdIns.Parameters.Add(parameter);
                    ix++;
                }
                cmdIns.Connection.Open();
                //this.conn.Open();
                //object insertID = cmdIns.ExecuteNonQuery();
                object insertID = cmdIns.ExecuteScalar();
                cmdIns.Connection.Close();
                //this.conn.Close();
                if (insertID != null)
                {
                    return insertID;
                }
                else
                {
                    return false;
                }
            }
        }
        catch (Exception ex)
        {
            return ex;
        }
    }

呼び出し機能:

db db = new db();
String[] valores = new String[2]
     {
         "usuario=" + this.textBox1.Text,
         "clave=" + this.maskedTextBox1.Text
      };
 object insert = db.insert(valores, "usuarios_tb");

助けてくださいありがとう...

4

1 に答える 1

0

次のコードは、発生する可能性のあるいくつかの問題を防ぎます。

  • 破棄される同じ接続を使用します。
  • コードの複雑さが軽減され (if/while/for が減り)、デバッグが容易になりました。
  • ExecuteScalar の代わりに ExecuteNonQuery を使用します。
  • アドバイス: 例外を処理しない場合は、例外をキャッチしないでください。戻り値として例外を使用しないでください。
  • アドバイス: 辞書を使用してください。この方法では、最初に値を連結し、後で分離する必要はありません。値の型も保持します。

これを見てください:

public int insert(IDictionary<string, object> inserts, String table)
{
    string query = "INSERT INTO " + table + " ";
    List<SqlParameter> parameters = new List<SqlParameter>();
    string camposItems = "(";
    string valoresItems = "(";

    foreach(KeyValuePair<string, object> pair in inserts)
    {
        if (!camposItems.EndsWith("("))
        {
            camposItems += ", ";
            valoresItems += ", ";
        }
        camposItems += pair.Key;
        valoresItems += "@" + pair.Key;
        SqlParameter parameter = new SqlParameter("@" + pair.Key, pair.Value);
        parameters.Add(parameter);
    }
    camposItems += ")";
    valoresItems += ")";
    query += camposItems + " VALUES " + valoresItems;

    using(SqlConnection conn = new SqlConnection(Properties.Settings.Default.dbConnectionString))
    using(SqlCommand cmdIns = new SqlCommand(query, conn))
    {
        cmdIns.Parameters.AddRange(parameters.ToArray());
        cmdIns.Connection.Open();
        return cmdIns.ExecuteNonQuery();
    }
}

そしてそれを呼び出す:

    db db = new db();
    Dictionary<string, object> valores = new Dictionary<string, object>
    {
        {"usuario", this.textBox1.Text},
        {"clave", this.maskedTextBox1.Text},
    };
    int rowsInserted = db.insert(valores, "usuarios_tb");

私は知っています、これはあなたの質問に本当に答えているわけではありませんが、あなたや他の人が実際に何がうまくいかないのかを知るのに役立つかもしれません. そしておそらく、複雑さを取り除くことによって、それはすでに機能しています(ConnectionとExecuteNonQuery、およびテーブル名の後の余分なスペースのため):)

于 2013-04-26T06:53:45.540 に答える