Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

#055<<  #056

СОВЕТ

Альтернативный код для замены XP_MAKEWEBTASK, который позволяет выводить данные из полей TEXT в таблицу HTML формата
По материалам статьи Paul Bates на microsoft.com: "A Code Alternative to Using XP_MAKEWEBTASK to Output TEXT Field Data"

Хранимая процедура XP_MAKEWEBTASK используется для вывода таблицы SQL Server в HTML формате. Однако, когда столбец таблицы содержит поле типа TEXT, XP_MAKEWEBTASK дает Вам два способа его отображения в столбец HTML таблицы:
- Создание отдельного текстового файла для каждого текстового поля в каждой строке; XP_MAKEWEBTASK создает ссылку к каждому такому текстовому файлу, содержащему текстовые данные поля.
- Вместо ссылки, размещают первые 255 символов TEXT поля в соответствующие столбцы HTML таблицы. Оставшуюся часть данных усекают.
Эта статья рассматривает способ, который позволяет вместить больше чем 255 символов непосредственно в таблицу HTML формата. В настоящее время, хранимая процедура XP_MAKEWEBTASK не может решить эту задачу, но проблема разрешима. Следующий пример демонстрирует одну альтернативную возможность, которая использует ODBC и C.
Пример:
Следующий ниже код создает web-страницу HTML и размещает полное поле TEXT в столбец HTML таблицы. Обратите внимание, что этот пример ограничивает размер поля TEXT 4КБ, но программист может внести соответствующие изменения в этот код, чтобы изменить это ограничение до желательного размера.
Пример выводит HTML код непосредственно на экран. Однако, вывод может быть перенаправлен в файл или CreateFile (), WriteFile() и CloseHandle() Win32 API могут быть добавлен, чтобы сохранять результаты непосредственно в файле.

Параметры настройки транслятора проекта

Эта программа должна быть откомпилирована средствами Visual C++, как 32 битное приложение. Пример написан на C ++, и файл должен иметь расширение .cpp.

Необходимые Headers/Libs

sql.h и sqlext.h файлы поставляются с ODBC SDK. ODBC SDK libs и headers необходимы для компиляции кода.

Особенности

Обратите внимание, что MAX_DATA определяет количество/длину данных, которые будут возвращены. Для текстовых полей может быть необходимо увеличение этого значения.
Пример написан для:

Server Name: paubate0
User: sa
Password: password

Однако, эти данные могут быть изменены, или их желательно добавить это как параметр командной строки.

Исполнение

Предполагается, что это было откомпилировано как web_cmd.cpp, командная строка следующая:

web_cmd pubs..sales > output.htm

Код

//The information in this document is provided "AS IS" without warranty of any kind, either
//expressed or implied, included without limitation the implied warranties of merchantability and
//fitness for a particular purpose.
//The user assumes the entire risk as to the accuracy and use of this code. In no event shall Microsoft
//or its suppliers be liable for any damages whatsoever, included without limitation, direct,
//consequential, indirect, incidental, loss of profit or special damages, even if Microsoft has been
//advised of such damages. Because some states do not allow the limitation of consequential or
//incidental damages, the foregoing limitation damages may not apply to you.

#include
#include
#include
#include
#include
#include

#define MAX_DATA 4096
#define MYSQLSUCCESS(rc) ((rc==SQL_SUCCESS)||(rc==SQL_SUCCESS_WITH_INFO))

class direxec
{
private:
RETCODE rc; // ODBC return code
HENV henv; // Environment
HDBC hdbc; // Connection handle
HSTMT hstmt; // Statement handle
unsigned char szData[MAX_DATA]; // Returned data storage
SDWORD cbData; // Output length of data
unsigned char chr_ds_name[SQL_MAX_DSN_LENGTH]; // Data source name

public:
void sqlconn(); // Allocate env,stat,and connect
void sqlexec(unsigned char *); // Execute SQL statement
void sqldisconn(); // Free pointers to env,stat,conn,
// and disconnect.
void error_out(); // Displays errors.
void html_head();
void html_end();
};

void direxec::html_head()
{
printf("<HTML>\n");
printf("<BODY>\n");
printf("<P>\n");
}

void direxec::html_end()
{
printf("</BODY>");
printf("</HTML>");
}

// Allocate environment handle, allocate connection handle,
// connect to data source, and allocate statement handle.
void direxec::sqlconn(void)

{
//Data source name is defined.
_mbscpy(chr_ds_name,(const unsigned char *)"paulbate0");

//Pointers are initialized to NULL for safety.
henv=NULL;
hdbc=NULL;
hstmt=NULL;

rc=SQLAllocEnv(&henv);
if (!MYSQLSUCCESS(rc)) error_out();

rc=SQLAllocConnect(henv,&hdbc);
if (!MYSQLSUCCESS(rc)) error_out();

rc=SQLConnect(hdbc,chr_ds_name,SQL_NTS,(unsigned char *)"sa",SQL_NTS,(unsigned char *)"password",SQL_NTS);
if (!MYSQLSUCCESS(rc)) error_out();

rc=SQLAllocStmt(hdbc,&hstmt);
if (!MYSQLSUCCESS(rc)) error_out();

}

// Execute SQL command with SQLExecDirect() ODBC API.
void direxec::sqlexec(unsigned char * cmdstr)
{
int i=0;
SWORD FAR num_cols;
int col_loop;

//Print HTML header
html_head();

//Get and print data
rc=SQLExecDirect(hstmt,cmdstr,SQL_NTS);
if (!MYSQLSUCCESS(rc)) error_out();
else
{
rc=SQLNumResultCols(hstmt,&num_cols);
if (!MYSQLSUCCESS(rc)) error_out();

//Print Table headers
printf("<TABLE BORDER=10>\n");

//Print Columns of Result Set
for (rc=SQLFetch(hstmt); rc == SQL_SUCCESS; rc=SQLFetch(hstmt))
{
++i; //for row count

printf("<TR>\n");
//print all the columns
for(col_loop=1; col_loop <= num_cols; ++col_loop)
{
printf("<TD>");

rc=SQLGetData(hstmt,col_loop,SQL_C_CHAR,szData,sizeof(szData),&cbData);
if (!MYSQLSUCCESS(rc)) error_out();

printf("%s",szData);
printf("</TD>");
}
printf("</TR>\n");
}

//Print table footer
printf("</TABLE>\n");

//row count=0 and either table empty or error
if (i==0) error_out();

//Print HTML Ending Tags
html_end();
}
}

// Free the statement handle, disconnect, free the connection handle and
// free the environment handle.
void direxec::sqldisconn(void)
{
rc=SQLCancel(hstmt);
if (!MYSQLSUCCESS(rc)) error_out();

rc=SQLFreeStmt(hstmt,SQL_DROP);
if (!MYSQLSUCCESS(rc)) error_out();

rc=SQLDisconnect(hdbc);
if (!MYSQLSUCCESS(rc)) error_out();

rc=SQLFreeConnect(hdbc);
if (!MYSQLSUCCESS(rc)) error_out();

rc=SQLFreeEnv(henv);
if (!MYSQLSUCCESS(rc)) error_out();
}

// Display error message in a message box that has an OK button.
void direxec::error_out(void)
{
unsigned char szSQLSTATE[10];
SDWORD nErr;
unsigned char msg[SQL_MAX_MESSAGE_LENGTH+1];
SWORD cbmsg;

while(SQLError(0,0,hstmt,szSQLSTATE,&nErr,msg,sizeof(msg),&cbmsg)== SQL_SUCCESS)
{
wsprintf((char *)szData,"Error:\nSQLSTATE=%s,Native error=%ld,msg='%s'",
szSQLSTATE,nErr,msg);
printf("%s\n",szData);

}
// Deallocate handles and disconnect.
if (hstmt != NULL) SQLFreeStmt(hstmt,SQL_DROP);
if (hdbc != NULL) SQLDisconnect(hdbc);
if (hdbc != NULL) SQLFreeConnect(hdbc);
if (henv != NULL) SQLFreeEnv(henv);
exit(-1);
}

int main(int argc,char *argv[])
{
char select_cmd[50]="SELECT * FROM ";

if (argc != 2)
{
//First Argument is the EXE name
//Second Argument is the Table name
printf("Usage: web_cmd \n");
return(FALSE);
}
else
{
// Declare an instance of the direxec object.
direxec x;

// Allocate handles and connect.
x.sqlconn();

// Concatinate Table Name and Execute Statement
strcat(select_cmd,argv[1]);

x.sqlexec((UCHAR FAR *)select_cmd);

// Free handles and disconnect
x.sqldisconn();

// Return success code; example executed successfully.
return (TRUE);
}
}
//End of Code

ГОТОВИМСЯ К ТЕСТУ ПО 70-028

ШПАРГАЛКА #10 Продолжение (обзор официального курса Microsoft)
Архив шпаргалок Вы найдёте на следующих сайтах:
http://www.sql.ru/subscribe/
http://subscribe.ru/archive/comp.soft.winsoft.sqlhelpyouself

Агенты репликации

Чтобы можно было проводить репликацию, необходимо сначала синхронизировать исходные таблицы данных и таблицы назначения. Агент создания моментальных снимков (Snapshot) используется при проведении начальной синхронизации во всех методах репликации. Этот агент готовит схему и содержимое публикуемых таблиц и хранимых процедур, а затем сохраняет файлы на дистрибуторе. Агент распределения (Distribution) применяет к подписчикам полученные от дистрибутора моментальные снимки данных. Кроме того, этот агент применяет к подписчикам транзакции базы данных Distribution. Средства репликации просматривают журнал транзакций каждой базы данных, для которой назначена репликация транзакций, и ищут транзакции, подлежащие репликации. Агент чтения журнала транзакций (Log Reader) копирует транзакции, помеченные для репликации в журнале транзакций издателя, в базу данных Distribution, где они остаются до тех пор, пока их не удастся распределить по соответствующим подписчикам и применить к их базам данных. Агент слияния (Merge) объединяет изменения данных из нескольких узлов, которые произошли с момента получения первоначального моментального снимка.
Поддерживается три типа репликации: репликация моментальных снимков, репликация транзакций и репликация слиянием. Репликация каждого типа применяется к одной публикации. В одной базе данных можно использовать несколько типов репликации.
Репликация моментальных снимков представляет собой периодическую передачу подписчикам новых моментальных снимков данных; это самый простой тип репликации с точки зрения настройки и сопровождения. Репликацию моментальных снимков целесообразно использовать в среде, характеризуемой следующими условиями: подписчикам требуются данные, доступные только для чтения; допускается большая задержка, поскольку данные обычно обновляются лишь периодически; подписчики могут поддерживать автономию узлов. Для реплицируемых таблиц в системе с репликацией моментальных снимков первичные ключи не требуются.
В процессе репликации транзакций изменения, произошедшие в исходной базе данных, реплицируются по месту назначения. Обычно репликация производится с минимальной задержкой. Репликацию транзакций можно использовать в условиях, когда подписчики должны получать измененные данные сразу после обновления, с минимальной задержкой.
Прежде чем начнется репликация транзакций, агент создания моментальных снимков делает первоначальный моментальный снимок. Можно задать частоту обновления этого моментального снимка. В журнале транзакций отслеживаются изменения таблиц, помеченных к репликации.
В ходе репликации слиянием узлам разрешается автономно друг от друга вносить изменения в реплицируемые данные. Впоследствии изменения, полученные со всех узлов, объединяются - периодически или по требованию. Репликация слиянием не обеспечивает согласованность транзакций, но гарантирует, что все узлы в итоге придут к одному результирующему набору. Репликацию слиянием можно использовать для фильтрации или разбиения данных. Прежде чем начнется репликация слиянием, агент создания моментальных снимков делает первоначальный моментальный снимок. Можно задать частоту обновления этого моментального снимка. В ходе репликации слиянием агент создания моментальных снимков копирует некоторые файлы вдобавок к тем, которые были скопированы во время репликации моментальных снимков и транзакций. Все изменения агент сохраняет в рабочей папке службы дистрибуции.
Выбор типа репликации определяет, какие используются агенты и ресурсы. Агент создания моментальных снимков читает содержимое базы данных и создает файлы моментальных снимков в рабочей папке на дистрибуторе. В ходе репликации моментальных снимков сервер сохраняет в базе данных Distribution сведения о состоянии, но не сохраняет данные. В случае принудительной подписки агент распределения работает на дистрибуторе. Этот агент применяет к подписчику моментальные снимки данных, взятые из рабочей папки службы дистрибуции. В случае подписки по запросу агент распределения работает на сервере-подписчике. Репликация транзакций обычно начинается с разовой процедуры репликации моментального снимка, необходимой для синхронизации данных; при этом может использоваться как принудительная подписка, так и подписка по запросу. Затем в ходе репликации транзакций агент чтения журнала транзакций периодически считывает содержимое журнала транзакций сервера-издателя и сохраняет эти сведения в базе данных Distribution. Агент распределения применяет изменения к серверам-подписчикам. Агент слияния проводит репликацию слиянием на сервере-подписчике, используя файлы, скопированные агентом создания моментальных снимков. В случае принудительной подписки агент слияния работает на дистрибуторе. В случае подписки по запросу агент слияния работает на сервере-подписчике. В ходе репликации слиянием сервер сохраняет в базе данных Distribution сведения о состоянии, но не сохраняет данные. Агент слияния получает от издателя изменения и применяет их к серверам-подписчикам. Затем агент слияния собирает изменения со всех подписчиков, применяет их к серверу-издателю и разрешает конфликты обновления, если они возникли.

Продолжение следует.

ПОЛЕЗНОСТИ

Первые шаги с ERwin 4.0
Автор: Ben Ettlinger.
Семейство продуктов ERwin компании Computer Associates - третьего по величине производителя программного обеспечения в мире - относится к мощным персональным CASE-средствам, предназначенным для моделирования баз данных различных типов. По результатам опроса, ERwin является самым используемым CASE-средством в России...[подробнее]
Компоненты ADO
Автор: Дмитрий Ю. Сидоров
В Delphi 5.0 появились компоненты для работы с Microsoft ActiveX Data Objects (далее ADO). ADO это технология стандартного обращения к реляционным данным от Microsoft. Эта технология аналогична BDE по назначению и довольно близка по возможностям...[подробнее]
Автоматизации "от данных" и информационное моделирование
Автор: Андрей Акопянц.
Задача этой публикации - описать тот набор понятий и подходов, который в течение ряда лет я успешно использовал при проектировании и реализации самых различных систем. Описываемая система понятий легко отображается в реляционную модель и обеспечивает регулярное проектирование пользовательского интерфейса...[подробнее]
Crystal Reports 8: Составление отчетов на основе кубов OLAP
Автор: olap.ru
Оперативная аналитическая обработка данных Online analytical processing (OLAP) - новая, более гибкая методика анализа корпоративных данных. Crystal Reports поддерживает большинство инструментов OLAP и позволяет вам создавать отчеты для этих баз данных...[подробнее]
Стандарты языка реляционных баз данных SQL: краткий обзор
Автор: С.Д. Кузнецов.
В статье содержатся некоторые рекомендации, направленные на то, чтобы облегчить создание мобильных прикладных информационных систем, опирающихся на использование реляционных систем управления базами данных (СУБД), которые поддерживают международный стандарт языка баз данных (БД) SQL. Чтобы лучше прояснить смысл статьи, необходимо сделать несколько предварительных замечаний...[подробнее]
Заполняем список из БД
Автор: Каев Артем.
Задача такая. Создать простое приложение на основе диалоговой панели с окном списка, которое заполнится из файла БД. За основу возьмем базу данных Access и механизм DAO...[подробнее]
Кто сказал что в VC сложнее работать с БД
Автор: Каев Артем.
Это будет повтор стандартного создания приложения принятого в примерах по VB и Delphi с целью демонстрации той же простоты...[подробнее]
XML: возможности и перспективы
Автор: Михаил Когаловский.
Судьбой Web, и прежде всего оценкой перспектив языка XML, являющегося основой новых Web-технологий, озабочен широкий круг людей, причастных к разработке и развитию информационных систем. В этом номере мы помещаем первую часть статьи о концептуальных возможностях XML...[подробнее]
Доступ к базе данных ADO/DAO через Winsock
Автор: Chris Hatton.
Проект показывает как Добавлять/Удалять, Читать/Записывать в БД ADO/DOA через сеть либо dialup соединение. Включена аутентификация. Присутствуют возможности просмотра присоединенных пользователей, а так же технология drag and drop для удалённого перетаскивания элементов базы данных. Так же пример позволяет пользователям сжимать базу сообщений для удобства хранения тысяч записей, и показывает как экспортировать сообщения и посылать их по электронной почте...[подробнее]

Новые технические статьи Microsoft

Support WebCast: Understanding INSTEAD OF Triggers in Microsoft SQL Server 2000
Support WebCast: Microsoft SQL Server 2000 Windows CE Edition Overview and Programming
Support WebCast: Microsoft SQL Server 2000 Log Shipping
Support WebCast: SQL Server 2000 Database Recovery: Backup and Restore
Installation and Customization of Microsoft Project Central
Q302675 - BUG: Delete on Nonindexed Column Fails with Error 1203
Support WebCast: Troubleshooting Distributed Queries in SQL Server 7.0
Support WebCast: Multi-instancing in Microsoft SQL Server 2000
Support WebCast: Microsoft SQL Server 2000: Merge Replication Enhancements
Support WebCast: Microsoft SQL Server 2000: New XML Features
Support WebCast: Analyzing Optimal Compiled Plan Caching
Support WebCast: Understanding User-Defined Functions in Microsoft SQL Server 2000
Support WebCast: Introduction to Microsoft SQL Server 2000 Clustering
Support WebCast: How to Effectively Use SQL Server Profiler
Support WebCast: Implementing ADOX in Jet and SQL Server Applications
Support WebCast: Microsoft SQL Server 7.0 Common Problems and Resolutions
Support WebCast: Optimizing SQL Server 7.0 on Windows 2000 Advanced Server and Windows 2000 Datacenter Server
Support WebCast: Inside Microsoft SQL Server 6.5 Replication
Support WebCast: Cascading Referential Integrity Constraints in SQL Server 2000
Support WebCast: SQL Server 7.0 Full-Text Search and Basic Troubleshooting Methods
Support WebCast: SQL Server 2000 Profiler: What's New and How to Effectively Use It
Support WebCast: SQL Server 7.0: Features of Data Transformation Services
Q274773 - FIX: If You Change Windows Security to Windows/SQL Security the SA Password is Blank
Q279123 - BUG: SQL Server 2000 Uninstallation May Break SQL Server CE Replication
Q279338 - FIX: DBCC CHECKCONSTRAINTS Does Not Handle Names with Special Characters
Q281239 - FIX: xp_findnextmsg Returns Multiple Rows When No Parameters Are Specified
Q281409 - FIX: BULK INSERT Fails with BATCHSIZE=1, FIRE_TRIGGERS, and TABLOCK
Q285544 - FIX: Dividing 0 by a Negative Decimal or Numeric Number Results in -0
Q285952 - FIX: NO_TRUNCATE May Be Added to Backup Log Statement when You Perform a Log Backup from SEM
Q290212 - INF: List of Bugs Fixed in SQL Server 2000 Service Pack 1 (1 of 2)
Q291366 - PRB: Upgrading SQL Server 6.5 Databases with Integrated Logins to SQL Server 7.0 or SQL Server 2000
Q297155 - FIX: DTS Error Message: "Cannot Load, Save or Execute the Package if some objects do not have a Name. Please specify Names for these objects."
Q299351 - BUG: MSDE Installation Fails on Systems that Have SQL Server 2000 Service Pack 1 Installed
Q299602 - FIX: Extended Stored Procedure xp_sendmail Does Not Handle DBCS Correctly
Q300964 - BUG: Memory Tab in SEM Displays Memory Settings Incorrectly on a Server that has More than 4 GB of RAM
Q300971 - BUG: SQL Does Not Display Error When Freeing a Nonexistent DLL
Q301913 - BUG: Error "There is not enough space on drive" When Extracting SQL Server 2000 SP1
Q303300 - FIX: Queue Reader Fails in SQL Server 2000 French Version
Q300217 - FIX: "Update Index in Background" Option in Change Tracking May Not Work if Very Low Disk Space Detected
Support WebCast: Implementing and Accessing Web Services Using Visual Basic 6.0 and the SOAP Toolkit for Visual Studio
Microsoft SQL Server 2000 User-Defined Functions
SQL Server 2000 Service Packs
Q302349 - HOWTO: Perform RDA Pull by Using SSCERelay and ActiveSync

ФОРУМ SQL.RU: САМЫЕ ПОПУЛЯРНЫЕ ТОПИКИ НЕДЕЛИ

Подкачка данных По поводу "А как же тогда" собственно по теме
А как же тогда ?
Люди ADO, ID достал! Помогите пожалуйста
Непонятка...
Вопрос по TRIGGER FOR UPDATE
Значение переменной по её имени ?
Ошибка при запросе на модификацию данных
Вопрос не по теме, но очень наболевший
Как перебросить записи с таблицы размером 1.8 Gb из Access 2000 в SQL7?

ФОРУМ SQL.RU: ВОПРОСЫ ОСТАЛИСЬ БЕЗ ОТВЕТА

Конвертация varchar on text?

Информация автора рассылки:
В связи с окончанием очередного, долгосрочного проекта, я вступаю в активную фазу поиска новой работы. В ближайшие несколько лет, мне было бы удобно работать в Москве или её окрестностях (речь идёт о новом, не коммерческом проекте, детали которого скоро будут представлены на Ваш суд). В виду вышеизложенных причин, предлагаю Вам свои услуги, как DBA. Если Вас это заинтересовало, присылайте, пожалуйста свои предложения по этому адресу: mssqlhelp@pisem.net

#055<<  #056


Вопросы, предложения, коментарии, замечания, критику и т.п. присылайте Александру на адрес: MSSQLHelp@pisem.net

sql.ru

Описание рассылки
 Поиск на SQL.RU
Искать: 
Результатов на странице: Формат:
Тип запроса: Раздел:
МИНИФОРМА
ПОДПИСКИ




http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться Рейтингуется SpyLog

В избранное