Определение имени столбца идентификатора SQL Server в .NET - PullRequest
1 голос
/ 22 июля 2009

Я пытаюсь написать некоторый универсальный код в VB.NET, который определяет, содержит ли таблица базы данных сервера SQL столбец идентификаторов и, если да, вернуть имя этого столбца.

Я работаю в Visual Basic 2008 Express и создал базу данных SQL «MyDatabase» с 1 таблицей под названием «MyTable». В этой таблице у меня есть 3 столбца: «ID», «Column1» и «Column2». Я знаю, я знаю ... изобретательные имена. В свойствах столбцов в обозревателе баз данных я установил для столбца «Идентификация» «Идентификация идентификатора» значение «да» и для значения «Идентификация» - «да».

Мне нужно, чтобы код .NET возвращал «ID» в качестве столбца идентификаторов. Это можно сделать через LINQ или каким-либо другим способом?

Заранее большое спасибо!

Удача

Ответы [ 3 ]

3 голосов
/ 22 июля 2009

Используйте SQLDataReader, чтобы открыть MyTable (SELECT ID from myTable WHERE 1 = 2) и использовать метод GetSchemaTable, который даст вам таблицу данных.

Согласно документам, проверьте содержимое столбца с именем IsAutoIncrement. Если он возвращает true, это должен быть столбец Identity.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable.aspx

Примечание. Это основано исключительно на моей памяти и помощи из документов MSDN.

2 голосов
/ 22 июля 2009

Если у вас есть Linq to SQL DataContext, вы можете получить метаданные таблицы, запросив контекст данных MappingSource :

var ctx = new YourDataContext();
var identityAndKey = ctx.Mapping.MappingSource
                                .GetModel(typeof(YourDataContext)) 
                                .GetMetaType(typeof(YourTable))
                                .DataMembers
                                .SingleOrDefault(i => i.IsDbGenerated &&
                                                      i.IsPrimaryKey);

Вы получите MetaDataMember экземпляр, который является свойством Primary Key и DbGenerated (Identity) вашего класса данных. Имя столбца доступно в свойстве Name.

Немного подумав, вы сможете повторно использовать этот код для любого контекста таблицы / данных.

0 голосов
/ 22 июля 2009

Вы можете вызвать хранимую процедуру sp_columns для получения этой информации и других:

SqlConnection sqlConx = new SqlConnection(p_conectionStrWithDB);
sqlConx.Open();
SqlCommand cmd = new SqlCommand("sp_columns", sqlConx);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@table_name", TableName));
DataTable tblColumns = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(tblColumns);

Редактировать: Вы также можете получить информацию о первичных ключах, как это:

SqlConnection sqlConx = new SqlConnection(p_conectionStrWithDB);
sqlConx.Open();
SqlCommand cmd = new SqlCommand("sp_pkeys", sqlConx);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@table_name", tableName));
DataTable tblConstraints = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(tblConstraints);
return tblConstraints;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...