Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование OLE DB Provider / 11 сообщений из 11, страница 1 из 1
21.11.2007, 19:29:27
    #34956609
Paxel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
Дорброе время суток!
Пытаюсь освоить использование OLE DB провайдера для MS SQL Server. Помогите, знающие люди, как в этой ситуации быть (использую VC++ 6.0), если надо выполнить скрипт для создания базы данных на сервере. Какова должна быть последовательность действий при использовании объектов классов CDataSource, CSession, CCommand?
...
Рейтинг: 0 / 0
21.11.2007, 19:39:14
    #34956622
Paxel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
Или подскажите ссылку, где об этом толково написано.
...
Рейтинг: 0 / 0
21.11.2007, 20:59:47
    #34956740
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
Paxel пишет:

> должна быть последовательность действий при использовании объектов
> классов CDataSource, CSession, CCommand?

Открыаешь коннекцию, парсишь скрипт до разделителя,
кормишь Command очередной порцией скрипта, выполняешь,
парсишь следующую порцию, кормишь, выполняешь.
И так до конца.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
29.11.2007, 13:13:21
    #34974697
Paxel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
А по-подробней можно? Если лень, дайте ссылочку...
...
Рейтинг: 0 / 0
29.11.2007, 13:39:28
    #34974808
Ex_Soft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
Начните отсюда
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
03.12.2007, 11:05:55
    #34981451
Paxel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
MasterZiv
Открыаешь коннекцию, парсишь скрипт до разделителя,
кормишь Command очередной порцией скрипта, выполняешь,
парсишь следующую порцию, кормишь, выполняешь.
И так до конца.


А какие у Command должны быть свойства, чтоб он съел скрипт. Вообще без свойств не ест. :(
...
Рейтинг: 0 / 0
04.12.2007, 07:24:50
    #34983801
Paxel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
Использую VC++ 6.0, SQL Server 2000, Ole DB provider for SQL Server

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
class CmyAccessor      //Создал акцессор
{
public:
	LONG m_column1;	//	Поля данных
         LONG m_column2;
         ...

BEGIN_COLUMN_MAP(CmyAccessor)
	COLUMN_ENTRY( 1 , m_column1)
	COLUMN_ENTRY( 2 , m_column2)
        ...
END_COLUMN_MAP()
	// You may wish to call this function if you are inserting a record and wish to
	// initialize all the fields, if you are not going to explicitly set all of them.
	void ClearRecord()
	{
		memset(this,  0 , sizeof(*this));
	}
};

HRESULT CmyData::OpenDB()      // Открываю datasource и session
{
		HRESULT		hr;
		CDBPropSet	dbinit(DBPROPSET_DBINIT);

		dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
		dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR("sa"));
		dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR("data"));
		dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR("(local)"));
		dbinit.AddProperty(DBPROP_INIT_LCID, (long) 1049 );
		dbinit.AddProperty(DBPROP_INIT_PROMPT, (short) 4 );
		hr = m_db.Open(_T("SQLOLEDB.1"), &dbinit);
		if (FAILED(hr))
			return hr;

		return m_session.Open(m_db);
}

HRESULT CmyData::fnWrite()      // Пытаюсь писать в БД
{
	CTable<CAccessor<CmyAccessor> > table;

	CDBPropSet	propset(DBPROPSET_ROWSET);
	propset.AddProperty(DBPROP_IRowsetChange, true);
	propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
	table.Open(m_session, "myTable", &propset);
	table.m_column1 = val1;
	table.m_column2 = val2;
         ...

	return table.Insert();     // insert возвращает DB_E_ERRORSOCCURRED
}
Подскажите, пожалуйста, что делаю не так? (table.Delete() работает)
...
Рейтинг: 0 / 0
04.12.2007, 10:14:31
    #34984049
Paxel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
С преыдущим вопросом разобрался. Ошибка была из-за того, что поле таблицы, соответствующее m_column1, является автоинкрементным. В связи с этим вопрос:
В классе CmyAccessor не должно быть перемнных, соответствующих автоматически заполняемым полям таблицы БД? Если нет, то какое значение им надо присваивать, чтоб происходило автозаполнение?

И еще подскажите:
Как сконвертировать CTime в DBTIMESTAMP чтоб произвести запись даты и времени в таблицу, акцессор для которой приведен ниже?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class CmyTableAccessor
{
public:
	LONG m_column1;
	LONG m_column2;
	DBTIMESTAMP m_column3;

BEGIN_COLUMN_MAP(CmyTableAccessor)
	COLUMN_ENTRY( 1 , m_column1)
	COLUMN_ENTRY( 2 , m_column2)
	COLUMN_ENTRY( 3 , m_column3)
END_COLUMN_MAP()

	// You may wish to call this function if you are inserting a record and wish to
	// initialize all the fields, if you are not going to explicitly set all of them.
	void ClearRecord()
	{
		memset(this,  0 , sizeof(*this));
	}
};

Заранее благодарю за помощь!
...
Рейтинг: 0 / 0
04.12.2007, 18:10:23
    #34986054
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
PaxelВ классе CmyAccessor не должно быть перемнных, соответствующих автоматически заполняемым полям таблицы БД? Если нет, то какое значение им надо присваивать, чтоб происходило автозаполнение?Нет, переменных быть не должно. Если ты присваиваешь значение автозаполняемому полю, то большинство серверов примет это значение и запомнит его, но в принципе может и ругнуться, стандартами это не оговорено и каждая СУБД в этом вопросе может вести себя по разному.
Не используй класс CTable. Никогда. Лучше привыкай формировать sql команды - намного меньше проблем и неоднозначности будет в будущем.
...
Рейтинг: 0 / 0
05.12.2007, 08:12:15
    #34986810
Paxel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
White Owl[quot Paxel]Не используй класс CTable. Никогда. Лучше привыкай формировать sql команды - намного меньше проблем и неоднозначности будет в будущем.

Т.е. вы имеете ввиду, что вместо всяческих транзакций, инсертов и апдэйтов для записи в БД лучше всего использовать SQL запрос типа (для таблицы из моего поста):
Код: plaintext
INSERT INTO myTable (column1,column2,column3) VALUES (DEFAULT,<значение>,<значение даты/времени>)
?

Если так, то подскажите, как правильно подобный запрос отправить на выполнение?

Спасибо за помощь!
...
Рейтинг: 0 / 0
05.12.2007, 11:22:56
    #34987393
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование OLE DB Provider
Если в column1 в БД стоит default-значение или автоинкрементация, то его в запросе вообще не надо писать.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование OLE DB Provider / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]