#visual-c #sql-server-express #visual-studio-express
#visual-c #sql-server-express #visual-studio-express
Вопрос:
На компьютере установлено следующее программное обеспечение:
- Microsoft SQL Server Express 2005
- Microsoft Visual C Express 2008
У меня есть файл .mdf, из которого мне нужно прочитать некоторые данные и записать их в текстовый файл. Я могу без проблем просматривать файл базы данных с помощью проводника базы данных в Visual Studio, но у меня возникают проблемы с подключением из приложения.
Я погуглил повсюду, почти во всех «решениях» говорится, что я должен начать новый проект и выбрать «шаблон приложения SQL server», которого у меня нет среди шаблонов. В других руководствах, которые я нашел, говорится, что я должен использовать «Мастер настройки источника данных», однако я не могу найти такой мастер ни в одном из меню.
Я не против щелкнуть, хотя я бы предпочел, чтобы все это было выполнимо в простом коде C . Что-то вроде:
DbConnection *d = new MSSQLConnection("local", "c:pathtofile.mdf");
DbQuery *q = new DbQuery(d, "select * from mytable");
...dump the data and go home
Спасибо.
В качестве альтернативы, если кто-нибудь может сказать мне, как это сделать на C :
http://sharpertutorials.com/connecting-to-a-sql-server-database/
Ответ №1:
И вот оно. Довольно просто и легко, как только вы это знаете…
SqlConnection^ myConnection = gcnew SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename="file.mdf";Integrated Security=True;Connect Timeout=10;User Instance=True");
myConnection->Open();
SqlCommand^ scmd = gcnew SqlCommand("select ID from atable", myConnection);
SqlDataReader^ r = scmd->ExecuteReader();
while (r->Read())
__int64 id = r->GetInt64(0);
r->Close();
Комментарии:
1. Для этого какие заголовочные файлы / ссылки мне нужно включить?
2. Это C CLI или special MS.NET C .
Ответ №2:
Это сработало для меня
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
using namespace std;
int main() {
#define SQL_RESULT_LEN 240
#define SQL_RETURN_CODE_LEN 1000
//define handles and variables
SQLHANDLE sqlConnHandle;
SQLHANDLE sqlStmtHandle;
SQLHANDLE sqlEnvHandle;
SQLWCHAR retconstring[SQL_RETURN_CODE_LEN];
//initializations
sqlConnHandle = NULL;
sqlStmtHandle = NULL;
//allocations
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, amp;sqlEnvHandle))
goto COMPLETED;
if (SQL_SUCCESS != SQLSetEnvAttr(sqlEnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0))
goto COMPLETED;
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, sqlEnvHandle, amp;sqlConnHandle))
goto COMPLETED;
//output
cout << "Attempting connection to SQL Server...";
cout << "n";
//connect to SQL Server
//I am using a trusted connection and port 14808
//it does not matter if you are using default or named instance
//just make sure you define the server name and the port
//You have the option to use a username/password instead of a trusted connection
//but is more secure to use a trusted connection
switch (SQLDriverConnectW(sqlConnHandle,
NULL,
(SQLWCHAR*)L"DRIVER={SQL Server};SERVER=ServerAddress, 1433;DATABASE=DataBaseName;UID=DataBaseUserName;PWD=PassWord;",
//(SQLWCHAR*)L"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=master;Trusted=true;",
SQL_NTS,
retconstring,
1024,
NULL,
SQL_DRIVER_NOPROMPT)) {
case SQL_SUCCESS:
cout << "Successfully connected to SQL Server";
cout << "n";
break;
case SQL_SUCCESS_WITH_INFO:
cout << "Successfully connected to SQL Server";
cout << "n";
break;
case SQL_INVALID_HANDLE:
cout << "Could not connect to SQL Server";
cout << "n";
goto COMPLETED;
case SQL_ERROR:
cout << "Could not connect to SQL Server";
cout << "n";
goto COMPLETED;
default:
break;
}
//if there is a problem connecting then exit application
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, sqlConnHandle, amp;sqlStmtHandle))
goto COMPLETED;
//output
cout << "n";
cout << "Executing T-SQL query...";
cout << "n";
//if there is a problem executing the query then exit application
//else display query result
if (SQL_SUCCESS != SQLExecDirectW(sqlStmtHandle, (SQLWCHAR*)L"SELECT @@VERSION", SQL_NTS)) {
cout << "Error querying SQL Server";
cout << "n";
goto COMPLETED;
}
else {
//declare output variable and pointer
SQLCHAR sqlVersion[SQL_RESULT_LEN];
SQLINTEGER ptrSqlVersion;
while (SQLFetch(sqlStmtHandle) == SQL_SUCCESS) {
SQLGetData(sqlStmtHandle, 1, SQL_CHAR, sqlVersion, SQL_RESULT_LEN, amp;ptrSqlVersion);
//display query result
cout << "nQuery Result:nn";
cout << sqlVersion << endl;
}
}
//close connection and free resources
COMPLETED:
SQLFreeHandle(SQL_HANDLE_STMT, sqlStmtHandle);
SQLDisconnect(sqlConnHandle);
SQLFreeHandle(SQL_HANDLE_DBC, sqlConnHandle);
SQLFreeHandle(SQL_HANDLE_ENV, sqlEnvHandle);
//pause the console window - exit when key is pressed
cout << "nPress any key to exit...";
getchar();
}
Комментарии:
1. ВЫ, СЭР, УДИВИТЕЛЬНЫ. Это сработало для меня! Единственное, с чем я боролся, это с юникодом, но переключив все на многобайтовый, он работал отлично.