0

ビューを作成し、そのビューからデータを取得しようとしています。これを実行しました:

 string command = "if OBJECT_ID('try1') IS NOT NULL Drop view try1" +"\n"+"go"+"\n";
        command = command + "Create view try1 as select WBSCode,Description,TerritoryCode,AmountReleased,convert(varchar(25),CreatedOn,106) as CreatedOn,IsEnable from WBS where WBSCode like '%" + msrch + "%'";
        command = command +"\n"+"go"+"\n"+"select WBSCode,Description,TerritoryCode,AmountReleased,convert(varchar(25),CreatedOn,106) as CreatedOn,IsEnable from try1 where TerritoryCode in (select TerritoryCode from Territory where StateCode='" + mbcode + "')";
        SqlCommand cmdd = new SqlCommand(command);
        cmdd.Connection = con;
        SqlDataAdapter da = new SqlDataAdapter(cmdd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        if (dt.Rows.Count > 0)
        {
            mngwbsGV1.DataSource = dt;
            mngwbsGV1.DataBind();
        } 

しかし、問題は私がその中でエラーを得ているというda.Fill(dt)ことです:

「go」付近の構文が正しくありません。
'CREATE VIEW' は、クエリ バッチの最初のステートメントである必要があります。
「go」付近の構文が正しくありません。

しかし、SQL Server 2008 でこれを実行しているときは実行されていますが、データを取得していません。

私は何をすべきか?

4

1 に答える 1

2

通常のSQLスクリプトを使用して、インストール中やバージョンアップグレード中など、ビューを個別に作成する必要があります。

これをコードで行う必要がある場合は、次のようにする必要があります

using(SqlConnection conn = new SqlConnection(--your connection string here--))
{
    SqlCommand dropView = new SqlCommand("IF OBJECT_ID('try1') IS NOT NULL DROP VIEW try1", conn);

    conn.Open();

    dropView.ExecuteNonQuery();

    SqlCommand createView = new SqlCommand("CREATE VIEW try1 AS SELECT WBSCode, Description, TerritoryCode, AmountReleased, CONVERT(VARCHAR(25), CreatedOn, 106) AS CreatedOn, IsEnable FROM WBS ", conn);

    createView.ExecuteNonQuery();

    conn.Close();
}

次に、これを使用して選択できます(SQLインジェクション攻撃を回避し、パフォーマンスを向上させるために、SQLコマンドを連結する代わりにパラメーター化されたクエリを使用してください!):

SqlCommand selectCmd = new SqlCommand("SELECT WBSCode, Description, TerritoryCode, AmountReleased, CreatedOn, IsEnable FROM try1 WHERE TerritoryCode IN (SELECT TerritoryCode FROM Territory WHERE WBSCode LIKE @msrch AND StateCode = @mbcode", conn);

selectCmd.Parameters.Add("@msrch", SqlDbType.VarChar, 50).Value = "%" + msrch + "%";
selectCmd.Parameters.Add("@mbcode", SqlDbType.VarChar, 50).Value = mbcode;

SqlDataAdapter da = new SqlDataAdapter(selectCmd);

DataTable dt = new DataTable();
da.Fill(dt);

if (dt.Rows.Count > 0)
{
    mngwbsGV1.DataSource = dt;
    mngwbsGV1.DataBind();
} 

しかし、繰り返しになりますが、このような単純な選択がある場合、最初にビューが必要なのは何ですか。特に、ビューを作成するだけの場合は、そこから選択して、すぐにもう一度ドロップします。まったく意味がありません...。

于 2012-12-14T06:32:21.963 に答える