Anda di halaman 1dari 3

public void GetFields() { SqlDataAdapter sdaFieldRetrieval; SqlCommand scmFieldRetrieval; DataTable dtFields = new DataTable(); // we'll retrieve ALL fieldinformation

with 1 single que ry. this query is quite long, but // doesn't use any systemspecific tables at all. string sSQL = "SELECT INFORMATION_SCHEMA.COLUMNS.*, (SELECT COLUMNPROPERTY(OBJECT_ID(@sTableName), INFORMATION_SCHEMA.COLUMNS.COLUMN _NAME" + ", 'IsComputed')) AS IsComputed, (SELECT COL_LEN GTH(@sTableName, INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME)" + ") AS ColumnLength, (SELECT COLUMNPROPERTY(OBJEC T_ID(@sTableName), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME" + ", 'IsIdentity')) AS IsIdentity, (SELECT COLUMNP ROPERTY(OBJECT_ID(@sTableName), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME" + ", 'IsRowGuidCol')) AS IsRowGuidColumn, (ISNULL( (SELECT CASE INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE" + " WHEN 'PRIMARY KEY' THEN 1 END FROM INF ORMATION_SCHEMA.KEY_COLUMN_USAGE INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS " + " ON INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRA INT_NAME=INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME" + " WHERE INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABL E_NAME = @sTableName AND INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME =" + " INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME AND INF ORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'PRIMARY KEY'" + "), 0)) AS IsPrimaryKey,(ISNULL((SELECT CASE IN FORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE WHEN 'FOREIGN KEY' THEN 1" + " END FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE I NNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS ON" + " INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT _NAME=INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME" + " WHERE INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABL E_NAME = @sTableName AND INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME =" + " INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME AND INF ORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'" + "), 0)) AS IsForeignKey, (ISNULL((SELECT CASE IN FORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE WHEN 'UNIQUE' THEN 1" + " END FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE I NNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS ON" + " INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT _NAME=INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME WHERE" + " INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME = @sTableName AND INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME =" + " INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME AND INF ORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'UNIQUE'" + "), 0)) AS HasUniqueConstraint FROM INFORMATION_ SCHEMA.COLUMNS WHERE TABLE_NAME = @sTableName"; scmFieldRetrieval = new SqlCommand(sSQL,m_scoActiveConne ction); sdaFieldRetrieval = new SqlDataAdapter(scmFieldRetrieval ); try { scmFieldRetrieval.Parameters.Add(new SqlParamete r("@sTableName", SqlDbType.VarChar, 250, ParameterDirection.Input, false, 0, 0, "", DataRowVersion.Proposed, m_sTableName));

// Fill the datatable sdaFieldRetrieval.Fill(dtFields); // Create field objects m_arrfFields = new clsField[dtFields.Rows.Count] ; // for each row, add a clsField object to the ar ray. for(int i = 0;i < m_arrfFields.Length;i++) { DataRow drCurrent = dtFields.Rows[i]; m_arrfFields[i] = new clsField(drCurrent ["COLUMN_NAME"].ToString()); // fill properties. m_arrfFields[i].bIsComputed = (Convert.T oInt32(drCurrent["IsComputed"]) == 1); m_arrfFields[i].bIsForeignKey = (Convert .ToInt32(drCurrent["IsForeignKey"]) == 1); m_arrfFields[i].bIsPrimaryKey = (Convert .ToInt32(drCurrent["IsPrimaryKey"]) == 1); m_arrfFields[i].bIsIdentity = (Convert.T oInt32(drCurrent["IsIdentity"]) == 1); m_arrfFields[i].bIsRowGUIDColumn = (Conv ert.ToInt32(drCurrent["IsRowGuidColumn"]) == 1); m_arrfFields[i].bHasUniqueConstraint = ( Convert.ToInt32(drCurrent["HasUniqueConstraint"]) == 1); m_arrfFields[i].sDataType = drCurrent["D ATA_TYPE"].ToString(); m_arrfFields[i].iLength = Convert.ToInt3 2(drCurrent["ColumnLength"]); if(drCurrent["CHARACTER_MAXIMUM_LENGTH"] .ToString().Length > 0) { // has a value int iCharacterMaxLength = Conver t.ToInt32(drCurrent["CHARACTER_MAXIMUM_LENGTH"]); if((m_arrfFields[i].sDataType.To Lower() == "nvarchar") || (m_arrfFields[i] .sDataType.ToLower() == "nchar")) { // set length to length mentioned in CHARACTER_MAXIMUM_LENGTH m_arrfFields[i].iLength = iCharacterMaxLength; } } m_arrfFields[i].iOrdinalPosition = Conve rt.ToInt32(drCurrent["ORDINAL_POSITION"]); if(drCurrent["NUMERIC_PRECISION"].ToStri ng().Length > 0) { m_arrfFields[i].iPrecision = Con vert.ToInt32(drCurrent["NUMERIC_PRECISION"]); } if(drCurrent["NUMERIC_SCALE"].ToString()

.Length > 0) { m_arrfFields[i].iScale = Convert .ToInt32(drCurrent["NUMERIC_SCALE"]); } m_arrfFields[i].slTypeToPrefix = m_slTyp eToPrefix; m_arrfFields[i].slTypeToNETType = m_slTy peToNETType; m_arrfFields[i].slTypeToVBCastType = m_s lTypeToVBCastType; m_arrfFields[i].slTypeToSqlType = m_slTy peToSqlType; m_arrfFields[i].slTypeToCSCastType = m_s lTypeToCSCastType; m_arrfFields[i].bIsNullable = (drCurrent ["IS_NULLABLE"].ToString().ToLower() == "yes"); m_arrfFields[i].sDefaultValue = drCurren t["COLUMN_DEFAULT"].ToString(); if(m_arrfFields[i].bIsPrimaryKey) { m_iAmountPrimaryKeyFields++; } // check if this field is excluded (i.e. , in the list of excluded fields) m_arrfFields[i].bIsExcluded = (m_alExclu dedFields.IndexOf(m_arrfFields[i].sFieldName.ToLower()) >= 0); } } catch(Exception ex) { // bubble error. throw new Exception("clsTable::GetFields:Error o ccured: " + ex.Message, ex); } finally { sdaFieldRetrieval.Dispose(); sdaFieldRetrieval = null; } }

Anda mungkin juga menyukai