2

SQLデータベースに接続するC#で記述されたWindowsアプリケーションがあります。

アプリケーション内にテキストフィールドがあり、次のようにデータベースを更新します。

string name = textBox60.Text;

string sql = "insert into myTable(Name) values ('" + name + "')";
DbHelper.ExecuteNonquery(sql);

public static int ExecuteNonquery(string sql)
    {
        using (SqlConnection cn = new SqlConnection(constr))
        {
            if (cn.State == ConnectionState.Closed)
            {
                cn.Open();
            }
            else if (cn.State == ConnectionState.Open)
            {
                cn.Close();
                cn.Open();
            }
            else if (cn.State == ConnectionState.Broken)
            {
                cn.Close();
                cn.Open();
            }
            using (SqlCommand cm = new SqlCommand(sql, cn))
            {
                return cm.ExecuteNonQuery();
            }
        }
    }

ただしnchar、データベース内のタイプを持つすべてのデータについて、それらは空白でいっぱいです。たとえば、テキストフィールドにabc"abc___________________"と入力すると、データベースをチェックすると、 (空白の)次のようになります。

文字列を読み取ったときにのみ文字列をトリミングするか、そのようなデータが大量にある場合にUPDATEデータSETを使用する以外に、これを防ぐ方法。TRIM(data)

手伝ってくれてありがとう。

4

2 に答える 2

13

ただし、データベース内のタイプがncharのすべてのデータでは、空白でいっぱいです。

うん、それはncharタイプが固定幅タイプだからです。基本的に、そのフィールドのすべての値の長さを20(または設定されているもの)にすることをデータベースに指示しています。nvarchar代わりに、可変幅フィールドであるを使用する必要があります。

また、次のようなコードを書くことは避けてください。

string sql = "insert into myTable(Name) values ('" + name + "')";

代わりに、パラメーター化されたSQLを使用し、SQL自体にプレースホルダーパラメーターを配置してから、コマンドでパラメーターの値を設定する必要があります。これにより、 SQLインジェクション攻撃やデータ変換の問題が回避され、コード(SQL)がデータ(パラメーター)から完全に分離されます。ただし、ヘルパーメソッドを変更する必要があることを意味します。(ヘルパーメソッドは最初はかなり奇妙に見えます-確かに、接続を作成したばかりの場合は、それを開く必要があります...それぞれに新しい接続オブジェクトを作成しなかったときから残っているコードです電話?)

于 2013-03-25T07:07:01.260 に答える
6

char(n)ではなくを使用してデータベーステーブルを宣言したためvarchar(n)、常に固定長になります。短い文字列を指定すると、スペースが埋め込まれます。

スペースが不要な場合は、列をとして宣言しますvarchar(n)


また、セレモニーのすべてが、使用する前に接続を使用して行っていることかどうかはわかりませんが、ほとんど意味がないようです。と呼んだばかりnew SqlConnection(...)です。事実上、これは閉鎖されることを意味しcnます-そのステータスをチェックする必要はありません。それを呼び出しOpen()て、コマンドの作成に進んでください。


(上記のすべては、として宣言されている列を前提としていますchar(n)。そうである場合nchar(n)は、に切り替える必要がありますnvarchar(n))。

于 2013-03-25T07:05:56.387 に答える