Retrieving Column Default Values from SQL Server

Problem

The DataColumn object exposes a Default property. While the FillSchema( ) method of the DataAdapter returns schema information, it does not include the default values for columns. You want to retrieve the default values of columns in a SQL Server table.

Solution

Use system stored procedures.

The sample code executes the system stored procedure sp_helpconstraint to get constraint information for the columns in the Orders table in the Northwind sample database. Column default values are identified and retrieved from the result set.

The C# code is shown in Example 10-3.

Example 10-3. File: ColumnDefaultsForm.cs

// Namespaces, variables, and constants
using System;
using System.Configuration;
using System.Text;
using System.Data;
using System.Data.SqlClient;

// . . . 

StringBuilder result = new StringBuilder( );

// Fill the Orders table with schema and data.
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Orders",
 ConfigurationSettings.AppSettings["Sql_ConnectString"]);
DataTable ordersTable = new DataTable(ORDERS_TABLE);
da.FillSchema(ordersTable, SchemaType.Source);
da.Fill(ordersTable);

SqlConnection conn = new SqlConnection(
 ConfigurationSettings.AppSettings["Sql_ConnectString"]);

// Command for system stored procedure returning constraints
SqlCommand cmd = new SqlCommand("sp_helpconstraint", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@objname",SqlDbType.NVarChar,776);
cmd.Parameters[0].Value = "Orders";
cmd.Parameters.Add("@nomsg",SqlDbType.VarChar,5);
cmd.Parameters[1].Value = "nomsg";

// Create a DataReader from the stored procedure.
conn.Open( );
SqlDataReader dr = cmd.ExecuteReader( );

// Iterate over the constraints records in the DataReader.
while(dr.Read( ))
{
 // Select the default value constraints only.
 String constraintType = dr["constraint_type"].ToString( );
 if (constraintType.StartsWith("DEFAULT"))
 {
 String constraintKeys = dr["constraint_keys"].ToString( );
 // Only strips single quotes for numeric default types
 // add necessary handling as required for nonnumeric defaults
 String defaultValue =
 constraintKeys.Substring(1, constraintKeys.Length - 2);

 String colName = constraintType.Substring(
 (constraintType.LastIndexOf("column") + 7));

 ordersTable.Columns[colName].DefaultValue = defaultValue;

 result.Append("Column: " + colName + " Default: " +
 defaultValue + Environment.NewLine);
 }
}
dr.Close( );
conn.Close( );

resultTextBox.Text = result.ToString( );

Discussion

The default value for a column in SQL Server is stored as a DEFAULT constraint. The system stored procedure sp_helpconstraint returns information about all constraints on a table. The procedure takes one mandatory parameter that specifies the table for which to return the constraint information.

The first column that the stored procedure returns is called constraint_type . As its name suggests, it specifies the type of constraint using the following pattern {constraint_type} [on column {column_name}] . For example, the default constraint on the Freight column in the Orders table in the Northwind sample database has a constraint type of DEFAULT on column Freight .

In the solution, a result set is created from the system stored procedure sp_helpconstraint specifying the Orders table. The constraint_type column is examined for each row to determine whether it begins with the word DEFAULT indicating a default constraint. For default constraints, the column name is the string following the word column in the constraint_type column.

Once the default constraints have been identified, the overloaded constraint_keys column contains the default value for the column. The default value is surrounded by parentheses as well as delimiters for nonnumeric fieldsfor example, single quotes by default in SQL Server for dates and strings, and an additional prefix N in the case of Unicode strings. These delimiters need to be stripped from the value before it can be assigned to the DefaultValue property for the column.

For more information about the sp_helpconstraint system stored procedure, see Microsoft SQL Server Books Online.

Connecting to Data

Retrieving and Managing Data

Searching and Analyzing Data

Adding and Modifying Data

Copying and Transferring Data

Maintaining Database Integrity

Binding Data to .NET User Interfaces

Working with XML

Optimizing .NET Data Access

Enumerating and Maintaining Database Objects

Appendix A. Converting from C# to VB Syntax



ADO. NET Cookbook
ADO.NET 3.5 Cookbook (Cookbooks (OReilly))
ISBN: 0596101406
EAN: 2147483647
Year: 2002
Pages: 222
Authors: Bill Hamilton

Flylib.com © 2008-2020.
If you may any questions please contact us: flylib@qtcs.net