こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VC++でSQL Serverに接続するには

初めての質問です。

開発環境は
Microsoft Visual C++ 2008 Express Edition
OS XP SP2
Microsoft SQL Server 2005
です。

VC++でSQL Serverに接続しようと思っているのですが
初心者ゆえ、殆ど(専門家から見れば、ほぼ全く)分かりません。
Microsoft Visual C++ 2008 Express Editionのため
MFCは使用できず、ODBCも同等の理由ゆえ使えないみたいです。
そこでOLE-DBにてSQL Serverへの接続を試みようと思いました。
しかしgoogleにて検索をかけてみるも、よく分からず
これといった情報や手がかりが掴めませんでした。
(一応、プロバイダーや、コンシューマテンプレートなどと
いった単語は文字通りの意味で目にしました)

SQL Serverへ接続するには、どうすればいいでしょうか?
何か必要な知識や、キーワード、を教えて頂ければ幸いです。

投稿日時 - 2008-11-02 00:39:23

QNo.4447210

困ってます

質問者が選んだベストアンサー

この手の質問はプログラミングカテゴリならすぐ回答がつくのかもしれませんが、VB/VC++のExpress Editionはデータベースへの接続はサポートしておらず、データベースファイルをアタッチして接続するしかありません。その辺が躓いている理由なのではないでしょうか。

VC++は書かないので拙いソースですが、接続のポイントは理解いただけるのではないかと思います。
#include "stdafx.h"
using namespace System;
using namespace System::Data;
using namespace System::Data::SqlClient;

int main(void)
{
String^ str;
SqlConnection^ sqlConn = gcnew SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\(データベースファイル).mdf;Integrated Security=True;User Instance=True");

sqlConn->Open();
str = "INSERT INTO テーブル VALUES (.....)";
SqlCommand^ sqlCmd = gcnew SqlCommand(str,sqlConn);
sqlCmd->ExecuteNonQuery();
sqlConn->Close();
return 0;
}

参考になれば、幸いです。

投稿日時 - 2008-11-02 17:49:19

お礼

>>jamshid6さん
ありがとうございます。
非常に参考になりました。

>VB/VC++のExpress Editionはデータベースへの接続はサポートしておらず、データベースファイルをアタッチして接続するしかありません。
そうだったのですか…
無知ゆえ、ドジな質問をして申し訳ございませんでした。
アタッチについて、更によく調べながら、jamshid6さんのご厚意を
無駄にしないプログラムを作ります。
本当にありがとうございました。

投稿日時 - 2008-11-02 20:30:26

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

>追加情報: ファイル C:Documents and Settings yukenMy Documents est2.mdf の自動的に名前が付けられたデータベースをアタッチできませんでした。

このメッセージを見る限り、明らかにmdfのパスを
C:\Documents and Settings\yuken\My Documents\est2.mdf
とされていますね。VC++の場合、接続文字列をただコピペしてもだめです。
VC++であれば、C:\\Documents and Settings\\yuken\\My Documents\\est2.mdfという風に「\」を重ねて書かないといけないのではないですか?
(こちらでやっても、「\」1つでは同じエラーがでますよ)

ついでにマイドキュメントではなく、C:\TEMPなどもっとパスが短いところで試してみてください。
(もともとマイドキュメントは権限が本人にしかないので、権限が理由のときに切り分けが難しくなります)

投稿日時 - 2008-11-04 18:48:14

補足

>>jamshid6さん
ありがとうございます!
接続を完全に成功させることができました!

また、パスが短い場所や、マイドキュメント以外の場所でも、同じように
接続に成功することができました!
本当に、ありがとうございました!

投稿日時 - 2008-11-05 00:35:19

ANo.5

データベースエクスプローラから該当のデータベースファイルに接続できて、その中身(テーブル等)がデータベースエクスプローラから参照できるのであれば、環境の問題の可能性は低いと思います。
(VC++Express自体がちゃんと接続できているということになるので)
念のため、データベースエクスプローラの接続追加画面から、新しくデータベースファイルを作成して試してみていただければと思います。

投稿日時 - 2008-11-04 10:20:34

補足

はい。
それも試してみたのですが…


実行が停止して躓いているところをよく確認してみたところ

str = "INSERT INTO Table1 (test) VALUES ('1')";

の箇所で問題が発生しているようです。
(何度も変更や新規作成などをしているので、これは先ほど実行した
ときの構文です)
何か、ここで問題が起きているのでしょうか?

投稿日時 - 2008-11-04 15:22:34

お礼

場所 System.Data.SqlClient.SqlConnection.Open()
場所 main() 場所 c:\documents and settings\tyuken\my documents\visual studio 2008\projects\project1\aaaaa\aaaaa\aaaaa.cpp:行 19</ExceptionString><DataItems><Data><Key>HelpLink.ProdName</Key><Value>Microsoft SQL Server</Value></Data><Data><Key>HelpLink.EvtSrc</Key><Value>MSSQLServer</Value></Data><Data><Key>HelpLink.EvtID</Key><Value>15350</Value></Data><Data><Key>HelpLink.BaseHelpUrl</Key><Value>http://go.microsoft.com/fwlink</Value>
</Data><Data><Key>HelpLink.LinkId</Key><Value>20476</Value></Data></DataItems></Exception></TraceRecord>
'System.Data.SqlClient.SqlException' のハンドルされていない例外が System.Data.dll で発生しました。

追加情報: ファイル C:Documents and SettingsyukenMy Documentsest2.mdf の自動的に名前が付けられたデータベースをアタッチできませんでした。同じ名前のデータベースが既に存在するか、指定されたファイルを開けないか、UNC 共有に配置されています。

プログラム '[532] aaaaa.exe: マネージ' はコード -532459699 (0xe0434f4d) で終了しました。


という出力がありました。
一体、何が原因なのでしょうか…

投稿日時 - 2008-11-04 15:51:41

ANo.4

>AttachDbFilename=C:\\db1
ファイルに拡張子がないようですが、普通にデータベースファイルを作成すると、拡張子は通常.mdfとつきます。
VC++ Expressにある「データベースエクスプローラ」で「接続の追加」で該当のデータベースファイルを選択し、接続を追加できますか?
できたら、その接続のプロパティを確認してください。接続文字列というのがあるはずです。

投稿日時 - 2008-11-03 22:14:18

補足

>>jamshid6さん
その文字列を使用しても、接続ができなかったので…
それで今、そこで躓いてしまっていて困っています。
なにか根本的なものが(構文ではなく、環境的なものが)原因で
接続ができなくなっているのでしょうか?

投稿日時 - 2008-11-04 00:17:03

ANo.3

今使っている接続文字列は何ですか?
他の端末にあるSQL Server Expressにつなごうとしているのですか?
(ローカルのSQL Serverならば共有パイプだけでも問題ないはずですが)

 #私はC++で書かないため、実は同じメッセージが出て悩んだのですが、理由は単純に「Data Source=.\SQLEXPRESS」と書いていたためで、「Data Source=.\\SQLEXPRESS」としたら通りました。

投稿日時 - 2008-11-03 14:47:49

補足

SqlConnection^ sqlConn = gcnew SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\db1;Integrated Security=True;User Instance=True");

です。
いろいろと試しているので、これはつい先ほど使用した
接続文字列です。

いつも申し訳ございません…

投稿日時 - 2008-11-03 20:54:07

ANo.2

#1です。誤認がありましたので、補足します。
ExpressEditionのデータベースエクスプローラからは確かにデータベースファイルの接続しかサポートしていないのですが、実際にやってみるとコーディング上は特に問題なくデータベースに接続できますね。

SqlConnection^ sqlConn = gcnew SqlConnection("Data Source=localhost;Initial Catalog=(データベース名);Integrated Security=True");
失礼しました。アタッチにこだわらず試していただければと思います。

投稿日時 - 2008-11-03 03:39:41

お礼

>>jamshid6さん
ありがとうございます。


'System.Data.SqlClient.SqlException' のハンドルされていない例外が System.Data.dll で発生しました。
というエラーを直すため格闘中です。
SQL Serverのリモートホストアクセスを許可したり
セキュリティソフトで遮断してしまわないように設定したり
いろいろと手を打っているのですが、なぜかこの
エラーメッセージが出てしまいます。
(しかし、なぜか1度だけ、構文は同じにも関わらずエラーメッセージが
出ずに実行を終了できていました)

そのときのエラーログですが

'System.Data.SqlClient.SqlException' のハンドルされていない例外が System.Data.dll で発生しました。

追加情報: SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 (provider: 名前付きパイプ プロバイダ, error: 40 - SQL Server への接続を開けませんでした)

プログラム '[3176] aaaaa.exe: マネージ' はコード -532459699 (0xe0434f4d) で終了しました。


とありました。
何度も申し訳ございませんが、お時間のあるときに答えて下されば
幸いです。

投稿日時 - 2008-11-03 11:00:00