Что-то тут не так... должно быть какое-то простое решение.
Итак: пробую загнать несколько команд в одну строку и выполнить. Не работает. Где грабли?
Скажем, требуется создать базу данных из порядка сотни таблиц. Ради этого создавать сотню выполнений SqlCommand — как-то накладно и некрасиво.
Код:
// вот это — две таблицы, которые надо создать зараз.
//
String* _tarr[] = {
// create SETTINGS table
//
"CREATE TABLE SETTINGS (\n",
"ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,\n",
"NAME_ID INTEGER NOT NULL ,\n",
"FUNCTION_ID INTEGER NOT NULL ,\n",
"CONTEXT_ID INTEGER NOT NULL ,\n",
"VALUE_ID INTEGER NOT NULL ,\n",
"TYPE_ID INTEGER NOT NULL\n",
");\n",
оно не выполняется, выкидывая следующую ошибку:
System.Data.SqlClient.SqlException: There is already an object named 'SETTINGS' in the database.
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at db.BIDatabase.CreateMasterDB()
Естественно, я проверял, никакой таблицы SETTINGS в базе нет.
Кроме того, если я оставляю только одну команду создания таблицы — работает нормально. Стало быть не нравится именно две команды.
Я, собственно, недавно начал работать с базами под .NET, так что вполне возможно, вопросы из разряда элеменетарных.. Но тем не менее, несколько часов уже убил на это дело.
Здравствуйте, p.s., Вы писали:
PS>Итак: пробую загнать несколько команд в одну строку и выполнить. Не работает. Где грабли?
Несколько команд одной строкой нельзя.
Здравствуйте, h256, Вы писали:
H>Здравствуйте, p.s., Вы писали:
PS>>Итак: пробую загнать несколько команд в одну строку и выполнить. Не работает. Где грабли? H>Несколько команд одной строкой нельзя.
SqlServer позволяет выполнять пакет запросов
Хотя не все БД это поддерживают
// create DATA_FLOAT table
//
"CREATE TABLE DATA_FLOAT (",
"ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,",
"VALUE FLOAT NOT NULL ,",
"TS INTEGER NOT NULL ",
");",
// create DATA_INT table
//
"CREATE TABLE DATA_INT (",
"ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,",
"VALUE INTEGER NOT NULL ,",
"TS INTEGER NOT NULL ",
");",
// create DATA_CHAR table
//
"CREATE TABLE DATA_CHAR (",
"ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,",
"VALUE CHAR(1) NOT NULL ,",
"TS INTEGER NOT NULL ",
");",
// create DATA_STRING table
//
"CREATE TABLE DATA_STRING (",
"ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,",
"VALUE VARCHAR(255) NOT NULL ,",
"TS INTEGER NOT NULL",
");",
// create DATA_TEXT table
//
"CREATE TABLE DATA_TEXT (",
"ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,",
"VALUE TEXT NOT NULL ,",
"TS INTEGER NOT NULL ",
");"
};
String* _tins __gc[] = {
// Insert initial TYPE rows into the tables
//
"INSERT INTO DATA_TYPES (TYPE,TABLE_NAME) VALUES ('CHAR','DATA_CHAR');",
"INSERT INTO DATA_TYPES (TYPE,TABLE_NAME) VALUES ('FLOAT','DATA_FLOAT');",
"INSERT INTO DATA_TYPES (TYPE,TABLE_NAME) VALUES ('INT','DATA_INT');",
"INSERT INTO DATA_TYPES (TYPE,TABLE_NAME) VALUES ('STRING','DATA_STRING');",
"INSERT INTO DATA_TYPES (TYPE,TABLE_NAME) VALUES ('TEXT','DATA_TEXT');"
//
};
Char sep[] = {';'};
if (Config->DBType->CompareTo(Config->DB_TYPE_MSSQL)) {
SqlConnection* myConnection = new SqlConnection(myConnString);
myConnection->Open();
try {
// creating BIS master database
//
SqlCommand* comm1 = new SqlCommand(String::Format("CREATE DATABASE {0}",dbMasterName), myConnection);
comm1->ExecuteReader();
} catch(System::Exception* pe) {
if (Config->Debug >= Config->DEBUG_CRITICAL)
Console::WriteLine(pe->ToString());
///return Config->SQL_ERROR_TABLE;
}
myConnection->Close();
// Connect to the new BIS master database
//
myConnString = String::Format("Persist Security Info=False;Integrated Security=SSPI;database={0};data source={1}",dbMasterName,Config->Host);
SqlConnection* conn = new SqlConnection(myConnString);
conn->Open();
String* _sqlCreateTables = new String("");
_sqlCreateTables = String::Join("",_tarr);
try {
SqlCommand* comm2 = new SqlCommand(_sqlCreateTables,conn);
comm2->ExecuteNonQuery();
} catch(System::Exception* pe) {
if (Config->Debug >= Config->DEBUG_CRITICAL) {
Console::WriteLine(pe->ToString());
}