Несколько SQL команд одновременно - вопрос
От: p.s.  
Дата: 01.05.04 20:52
Оценка:
Привет всем,

Что-то тут не так... должно быть какое-то простое решение.

Итак: пробую загнать несколько команд в одну строку и выполнить. Не работает. Где грабли?
Скажем, требуется создать базу данных из порядка сотни таблиц. Ради этого создавать сотню выполнений 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",

// create DATA_TYPES table
//
"CREATE TABLE DATA_TYPES (\n",
"TYPE_ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,\n",
"TYPE VARCHAR( 32 ) NOT NULL ,\n",
"TABLE_NAME VARCHAR( 64 ) NOT NULL \n",
");\n"
};

// объединяем...
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());
return Config->SQL_ERROR_TABLE;
}

оно не выполняется, выкидывая следующую ошибку:
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, так что вполне возможно, вопросы из разряда элеменетарных.. Но тем не менее, несколько часов уже убил на это дело.

Прошу совета.. Спасибо!
Re: Несколько SQL команд одновременно - вопрос
От: h256 Россия  
Дата: 01.05.04 21:29
Оценка:
Здравствуйте, p.s., Вы писали:

PS>Итак: пробую загнать несколько команд в одну строку и выполнить. Не работает. Где грабли?

Несколько команд одной строкой нельзя.
Re: Несколько SQL команд одновременно - вопрос
От: fist Россия  
Дата: 02.05.04 03:18
Оценка:
Здравствуйте, p.s.,
Ваш код полностью рабочий.
Ошибка скорее всего в другом месте.
Re[2]: Несколько SQL команд одновременно - вопрос
От: fist Россия  
Дата: 02.05.04 03:22
Оценка:
Здравствуйте, h256, Вы писали:

H>Здравствуйте, p.s., Вы писали:


PS>>Итак: пробую загнать несколько команд в одну строку и выполнить. Не работает. Где грабли?

H>Несколько команд одной строкой нельзя.

SqlServer позволяет выполнять пакет запросов
Хотя не все БД это поддерживают
Re[2]: Несколько SQL команд одновременно - вопрос
От: p.s.  
Дата: 02.05.04 19:09
Оценка:
Здравствуйте, fist, Вы писали:

F>Здравствуйте, p.s.,

F>Ваш код полностью рабочий.
F>Ошибка скорее всего в другом месте.

Спасибо огромное!

Действительно, ошибка была в другом месте.. Теперь работает. На всякий случай, если у кого потом возникнет аналогичный вопрос, вот исходный код:

==== db.h ======
// db.h

#pragma once

#using <System.dll>
#using <System.Data.dll>
#using <System.Xml.dll>

using namespace System;
using namespace System::Data;
using namespace System::Xml;
using namespace config;

namespace db
{
public __gc class BIDatabase
{

public:

int CreateMasterDB(void);
BIDatabase(BIConfig*);


private:

String* dbQuery;
String* dbConnection;
String* dbMasterName;

BIConfig* Config;
};

}

====/db.h ======

==== db.cpp =====
// This is the main DLL file.

#include "stdafx.h"
#include "db.h"

using namespace db;
using namespace System::Data::SqlClient;
using namespace System;

int BIDatabase::CreateMasterDB(void)
{
// creating SQL command for master database core tables
//
String* _tarr __gc[] = {

// create SETTINGS table
//
"CREATE TABLE SETTINGS (",
"ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,",
"NAME_ID INTEGER NOT NULL ,",
"FUNCTION_ID INTEGER NOT NULL ,",
"CONTEXT_ID INTEGER NOT NULL ,",
"VALUE_ID INTEGER NOT NULL ,",
"TYPE_ID INTEGER NOT NULL",
");",

// create DATA_TYPES table
//
"CREATE TABLE DATA_TYPES (",
"TYPE_ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,",
"TYPE VARCHAR( 32 ) NOT NULL ,",
"TABLE_NAME VARCHAR( 64 ) NOT NULL ",
");",

// create STRINGS table
//
"CREATE TABLE STRINGS (",
"ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,",
"VALUE VARCHAR( 64 ) NOT NULL ",
");",

// 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)) {

String* myConnString =
String::Format("Persist Security Info=False;Integrated Security=SSPI;database=MASTER;data source={0}",Config->Host);

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());
}

}

conn->Close();



}

return 0;
}

BIDatabase::BIDatabase(BIConfig* cfg)
{
Config = cfg;
dbMasterName = Config->MasterDB;
}
====/db.cpp =====
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.