2

データベーステーブルにアクセスし、行と列をテーブルに挿入および更新するプロジェクトを構築しています。

を使用してデータベース内のテーブルを更新していますGridView。これを使用して、毎回別のテーブルに新しい列を追加しています。

button_Click の私のコードは次のとおりです。

com = new SqlCommand("ALTER TABLE Location_Profile_Master ADD " + LocProName.Text + " int", con);
            con.Open();
            com.ExecuteNonQuery();
            con.Close();

            foreach (GridViewRow row in GridView1.Rows)
            {
                string Pro_Name = row.Cells[1].Text;

                for (int i = 1; i < GridView1.Columns.Count; i++)
                {
                    int n = Convert.ToInt16(row.Cells[i + 1].Text);
                    //short n = 0;
                    //if (Int16.TryParse(row.Cells[i + 1].Text, out n))
                    //{
                        com = new SqlCommand("UPDATE Location_Profile_Master SET " + LocProName.Text + "='" + n + "' WHERE Profile_Name='" + Pro_Name.ToString().Trim() + "' ", con);
                        con.Open();
                        com.ExecuteNonQuery();
                        con.Close();
                    //}
                }

            }

したがって、列とその値を追加するときに、その列名がデータベースに既に存在するかどうかを確認し、存在しない場合は、列の値がデータベースに既に存在するかどうかを確認します。その列がデータベースにすでに存在することをユーザーに通知する必要があります。

また、行を挿入しているときに、その行がテーブルに既に存在するかどうかを知りたいです。

親切に助けてください。

4

4 に答える 4

1

MS SQL-Serverの情報スキーマビューでスキーマ情報を直接読み取ることもDataReader.ExecuteReader(CommandBehavior.SchemaOnly)、特定のテーブルのスキーマ情報を取得するために使用することもできます。

DataTable schema;
using (var con = new System.Data.SqlClient.SqlConnection(conStr))
{
    var getSchemaSql = String.Format("SELECT * FROM {0}", tableName);
    using (var schemaCommand = new System.Data.SqlClient.SqlCommand(getSchemaSql, con))
    {
        con.Open();
        using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly))
        {
            schema = reader.GetSchemaTable();
        }
    }
}

そしてこれに似たもの:

for (int rowIndex = 0; rowIndex < schema.Rows.Count; rowIndex ++)
{
    DataRow schemaRow = schema.Rows[rowIndex];
    String columnName = schemaRow.Field<String>("ColumnName");
    Type dataType = schemaRow.Field<Type>("DataType");
    Int32 columnSize = schemaRow.Field<Int32>("ColumnSize");
    if (dataType.FullName == "System.String")
    {
        // ...
    } 
 }

または、特定の列名がそのテーブルに存在するかどうかを単に確認したい場合は、次のようにします。

String colName = "Column1";
bool exists = schema.AsEnumerable()
                    .Any(r => r.Field<String>("ColumnName") == colName);

行がすでに存在するかどうかを知りたい場合は、その行の主キー/識別子をEXISTSSQLで使用できます。

IF NOT EXISTS(SELECT 1 FROM Location_Profile_Master WHERE PROFILE_NAME=@ProfileName)
于 2012-09-06T07:21:35.323 に答える
0

次のようなこの種のストアドプロシージャを作成する方がよいでしょう。

IF EXISTS ( SELECT 1 
            FROM INFORMATION_SCHEMA.COLUMNS 
            WHERE TABLE_NAME = 'Location_Profile_Master' 
              AND Column_Name = @columnParam) 
BEGIN
    -- The column exists
END
ELSE
    -- The column doesn't exit
于 2012-09-06T07:21:58.393 に答える
0

まず第一にアドバイス: value の代わりに parameters を使用してください"'" + "'"。これは SQL インジェクションに対して機密性が高いためです。

列が存在するかどうかをデータベースにチェックインするには、次を使用できます。

SELECT CASE  WHEN COL_LENGTH('tableName', 'columnName') IS NOT NULL 
THEN 1 ELSE 0 END AS isExists

これにより、データベースにテーブルが存在しない場合でも 0 が返されます

于 2012-09-06T07:23:37.990 に答える
0

MS SQL Server を使用していると仮定します。次のコードを試して、列が存在するかどうかを確認し、その中に行が存在するかどうかを確認します。

IF EXISTS(SELECT * FROM SYS.COLUMNS WHERE Name = N'columnName'  
            AND Object_ID = Object_ID(N'Location_Profile_Master'))
BEGIN
    -- Column Exists
    IF EXISTS (SELECT Profile_Name FROM Location_Profile_Master WHERE Profile_Name = @yourValue)
    BEGIN
        --value exists
    END
END
于 2012-09-06T07:22:44.700 に答える