如何在插入或更新表时检查表中是否已存在行或列

时间:2012-09-06 07:03:12

标签: c# asp.net sql

我正在构建一个项目,在该项目中我访问数据库表,在表中插入和更新行和列。

我正在使用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 个答案:

答案 0 :(得分:1)

您可以直接在Information Schema Views中阅读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);

如果你想知道一行是否已经存在,你可以在sql中使用它的主键/标识符和EXISTS

IF NOT EXISTS(SELECT 1 FROM Location_Profile_Master WHERE PROFILE_NAME=@ProfileName)

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

首先是一个建议:使用参数而不是值"'" + "'",因为它对SQL注入是敏感的。

要检查数据库中是否存在列,您可以使用:

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

即使数据库中不存在该表,这也会给你一个0