Come posso determinare se esiste una colonna in una tabella SQL Server CE con C #?

Il codice legacy fa così:

public bool isValidField(string tableName, string fieldName) { bool retVal; string tblQuery = string.Format("SELECT {0} FROM {1}", fieldName, tableName); checkConnection(); try { SqlCeCommand cmd = objCon.CreateCommand(); cmd.CommandText = tblQuery; object objvalid = cmd.ExecuteScalar(); retVal = (null != objvalid); } catch { retVal = false; } return retVal; } 

… ma trovo che non sempre funziona. Dopo aver chiamato quel metodo e false , qualche codice ALTERE la tabella per aggiungere alcune colonne, ma sto ottenendo:

Un ID colonna si è verificato più di una volta nella specifica.

Ho trovato qui su StackOverflow un paio di dichiarazioni SQL promettenti:

 if exists(select * from sys.columns where Name = N'columnName' and Object_ID = Object_ID(N'tableName')) 

e

 IF COL_LENGTH('table_name','column_name') IS NULL 

… ma non sono sicuro di come implementarlo in C # / .NET 1.1

Devo usare ExecuteScalar e trasmettere il valore restituito a un bool? O qualcos’altro?

AGGIORNARE

Cambiarlo a questo non ha corretto le cose:

 public bool isValidField(string tableName, string columnName) { bool retVal; string tblQuery = string.Format( "COL_LENGTH({0},{1}) IS NULL", tableName, columnName); checkConnection(); try { SqlCeCommand cmd = objCon.CreateCommand(); cmd.CommandText = tblQuery; object objvalid = cmd.ExecuteScalar(); retVal = Convert.ToBoolean(objvalid); } catch { retVal = false; } return retVal; } 

AGGIORNAMENTO 2

Stranamente, vedo ancora più di questi messaggi di errore con il nuovo codice.

AGGIORNAMENTO 3

Non ha fatto differenza quando ho modificato il codice in questo modo:

 string tblQuery = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS" + " WHERE TABLE_NAME = @tableName AND COLUMN_NAME" + " = @columnName"; checkConnection(); try { SqlCeCommand cmd = objCon.CreateCommand(); cmd.CommandText = tblQuery; SqlCeParameter tblNameParam = new SqlCeParameter( "@tableName", SqlDbType.NVarChar, 128); tblNameParam.Value = tableName; cmd.Parameters.Add(tblNameParam); SqlCeParameter colNameParam = new SqlCeParameter( "@columnName", SqlDbType.NVarChar, 128); colNameParam.Value = tableName; cmd.Parameters.Add(colNameParam); int i = (int)cmd.ExecuteScalar(); retVal = i > 0; } 

… quindi non so da che parte è preferibile; questo mi sembra più semplice … qualche pensiero, qualcuno?

Puoi semplicemente eseguire una query sulle tabelle dello schema di informazioni per ottenere le informazioni desiderate:

 public bool isValidField(string tableName, string columnName) { var tblQuery = "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS" + " WHERE TABLE_NAME = @tableName AND" + " COLUMN_NAME = @columnName"; SqlCeCommand cmd = objCon.CreateCommand(); cmd.CommandText = tblQuery; var tblNameParam = new SqlCeParameter( "@tableName", SqlDbType.NVarChar, 128); tblNameParam.Value = tableName cmd.Parameters.Add(tblNameParam); var colNameParam = new SqlCeParameter( "@columnName", SqlDbType.NVarChar, 128); colNameParam.Value = columnName cmd.Parameters.Add(colNameParam); object objvalid = cmd.ExecuteScalar(); // will return 1 or null return objvalid != null; } 
  public bool IsValidField(SqlCeConnection objCon, string tableName, string columnName) { const string query = "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS" + " WHERE TABLE_NAME = @TABLENAME AND" + " COLUMN_NAME = @COLUMNNAME"; using (var cmd = new SqlCeCommand(query, objCon)) { cmd.Parameters.Add("@TABLENAME", SqlDbType.NVarChar, 128).Value = tableName; cmd.Parameters.Add("@COLUMNNAME", SqlDbType.NVarChar, 128).Value = columnName; var objvalid = cmd.ExecuteScalar(); // will return 1 or null return objvalid != null; } }