‘/’ アプリケーションでサーバー エラーが発生しました。

症状

ASP.NET で、データの編集を行った場合、次のエラーが発生。

‘/’ アプリケーションでサーバー エラーが発生しました。

‘nvarchar’ 付近に不適切な構文があります。
スカラー変数 “@ID” を宣言してください。

説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.Data.SqlClient.SqlException: ‘nvarchar’ 付近に不適切な構文があります。
スカラー変数 “@ID” を宣言してください。

原因

SQLサーバーの列名にスペースが含まれている場合に、更新のSQLコマンドが正しく生成されないVisual Studio のバグ。

対策1

SQLサーバーの列名のスペースを削除するか、’_’ で置き換える

対策2

Updating イベントで、CommandTextと、ParameterName を置き換える。

例: 列名 [test data]の場合
e.Command.CommandText で、”@test_data”となっているが、
一方、e.CommandParameters では、”@test data”となっている。このため、パースが失敗して、アップデートに失敗しているものと思われる。
そこで、この名前を一致させる。

        protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
        {
            e.Command.CommandText = e.Command.CommandText.Replace("@test_data", "@testdata");
            foreach (System.Data.Common.DbParameter p in e.Command.Parameters)
            {
                if (p.ParameterName == "@test data")
                {
                    p.ParameterName = "@testdata";
                }
            }
        }