0

tbDepartment(id、title、abbreviation)という名前のテーブルがあり、 GridViewTitleとAbbreviationの2つの列が含まれています

ユーザーがgridViewに挿入したタイトルがテーブルのタイトルと等しいかどうかを知る必要がありますtbDepartment。trueの場合、IDを取得します。それ以外の場合は、新しいユーザーを作成する必要があります。

私が書いたのはifステートメントを入力していません。誰かがそれを修正する方法を教えてもらえますか?

string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@Desc, @DepCode)";

string sqlDep = "Select [ID] from tbDepartment where Title = '" + gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]).ToString() +"'" ;
SqlCommand cmdDep = new SqlCommand(sql2, connection);

if (sqlDep == 0)
{
    cmdDep.Parameters.Add("@Desc", SqlDbType.VarChar,50);
    cmdDep.Parameters.Add("@DepCode", SqlDbType.VarChar, 50);
    cmdDep.Parameters["@Desc"].Value = Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepDesc]));
    cmdDep.Parameters["@DepCode"].Value = Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]));
}
4

4 に答える 4

3

最初にクエリを実行して ExecuteScalar で ID を取得します。null 以外の値が返された場合 (タイトルが見つかったことを意味します)、ID を取得しています。それ以外の場合は、新しいデータの挿入を実行します。

一方、文字列連結を使用して SQL コマンドを実行しないでください。( SQL インジェクション)

string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@Desc, @DepCode)";
string sqlDep = "Select [ID] from tbDepartment where Title = @title" 

SqlCommand cmdDep = new SqlCommand(sqlDep, connection);
cmdDep.Parameters.AddWithValue("@title", gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]).ToString();
object result = cmdDep.ExecuteScalar();
if(result != null)
{
    cmdDep.Parameters.Clear();
    cmdDep.CommandText = sql2;
    cmdDep.Parameters.AddWithValue("@Desc", Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepDesc]);
    cmdDep.Parameters.AddWithValue("@DepCode", Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]));
    cmdDep.ExecuteNonQuery();
}
else
    int id = Convert.ToInt32(result);

これとは別に、上記のクエリには正しくないものがあります。Titleから検索する値を取得しますがgridView3.GetRowCellValue(i, gridView3.Columns[DepCode]) 、挿入クエリでは、この同じグリッド セルを使用して列の値を更新し、別のセルを使用しAbbreviation て列を更新すると、おそらく正しい挿入テキストは次のようになります。TitlegridView3.GetRowCellValue(i, gridView3.Columns[DepDesc]))

string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@DepCode, @Desc)";
于 2013-02-13T15:27:01.357 に答える
1

SqlCommand.ExecuteScalarクエリによって返された結果セットの最初の行の最初の列を返します。これは、IDまたはnullを取得する方法です。

string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@Desc, @DepCode)";

string sqlDep = "Select [ID] from tbDepartment where Title = '" + gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]).ToString() +"'" ;
SqlCommand cmdDep = new SqlCommand(sql2, connection);
SqlCommand cmdUser = new SqlCommand(sqlDep , connection);

var id = cmdUser.ExecuteScalar() as int?;

if (id == null) //nothing found
{
   //add new
    cmdDep.Parameters.Add("@Desc", SqlDbType.VarChar,50);
    cmdDep.Parameters.Add("@DepCode", SqlDbType.VarChar, 50);
    cmdDep.Parameters["@Desc"].Value = Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepDesc]));
    cmdDep.Parameters["@DepCode"].Value = Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]));
}
else
{
   //edit
}
于 2013-02-13T15:25:19.587 に答える
1

実行する前に、必ず接続を開いてください。を使用usingすると、使用後に接続が確実に破棄されます。最初に DateReader を実行してレコードをチェックし、次に NonQuery を実行して挿入します。また、単一のクエリで、またはストアド プロシージャを使用して、これを行うことができます。

using(SqlConnection con = new SqlConnection("YourConnectionString"))
{
   string selectQuery = "Select [ID] from tbDepartment where Title = @Title";
   SqlCommand cmd = new SqlCommand(selectQuery, con);

   cmd.Parameters.AddWithValues("@Title", "Title_Value");
   con.Open();
   SqlDataReader reader = cmd.ExecuteReader();

   if(!reader.HasRows){
       string insertQuery = "Insert into tbDepartment ([Title], [Abbreviation]) " +
                            "values (@Title, @Abb)";

       cmd.CommandText = insertQuery;
       cmd.Parameters.AddWithValues("@Abb", "Abb_Value");
       cmd.ExecuteNonQuery();
   }

}
于 2013-02-13T15:37:04.137 に答える
0

ただしsqlDep、文字列のインスタンスに設定されています。null になることはありません。ロジックを再評価する必要があります。

于 2013-02-13T15:20:08.330 に答える