• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VC++でSQL Serverに接続するには)

VC++でSQL Serverに接続する方法

このQ&Aのポイント
  • VC++でSQL Serverに接続する方法について詳しく知りたいです。初心者であるため、具体的な手順や必要なキーワードを教えてください。
  • VC++でSQL Serverに接続する方法についての情報が不足しています。MFCが使用できないため、ODBCも使えません。代わりにOLE-DBを使用する方法についても教えてください。
  • VC++でSQL Serverに接続するためには、どのような知識とキーワードが必要ですか?Googleで検索しても情報が得られませんでした。具体的な手順を教えてください。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

この手の質問はプログラミングカテゴリならすぐ回答がつくのかもしれませんが、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; } 参考になれば、幸いです。

yamatonbo
質問者

お礼

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

その他の回答 (5)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.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などもっとパスが短いところで試してみてください。 (もともとマイドキュメントは権限が本人にしかないので、権限が理由のときに切り分けが難しくなります)

yamatonbo
質問者

補足

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

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.5

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

yamatonbo
質問者

お礼

場所 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 Settings yukenMy Documents est2.mdf の自動的に名前が付けられたデータベースをアタッチできませんでした。同じ名前のデータベースが既に存在するか、指定されたファイルを開けないか、UNC 共有に配置されています。 プログラム '[532] aaaaa.exe: マネージ' はコード -532459699 (0xe0434f4d) で終了しました。 という出力がありました。 一体、何が原因なのでしょうか…

yamatonbo
質問者

補足

はい。 それも試してみたのですが… 実行が停止して躓いているところをよく確認してみたところ str = "INSERT INTO Table1 (test) VALUES ('1')"; の箇所で問題が発生しているようです。 (何度も変更や新規作成などをしているので、これは先ほど実行した ときの構文です) 何か、ここで問題が起きているのでしょうか?

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

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

yamatonbo
質問者

補足

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

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

今使っている接続文字列は何ですか? 他の端末にあるSQL Server Expressにつなごうとしているのですか? (ローカルのSQL Serverならば共有パイプだけでも問題ないはずですが)  #私はC++で書かないため、実は同じメッセージが出て悩んだのですが、理由は単純に「Data Source=.\SQLEXPRESS」と書いていたためで、「Data Source=.\\SQLEXPRESS」としたら通りました。

yamatonbo
質問者

補足

SqlConnection^ sqlConn = gcnew SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\db1;Integrated Security=True;User Instance=True"); です。 いろいろと試しているので、これはつい先ほど使用した 接続文字列です。 いつも申し訳ございません…

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

#1です。誤認がありましたので、補足します。 ExpressEditionのデータベースエクスプローラからは確かにデータベースファイルの接続しかサポートしていないのですが、実際にやってみるとコーディング上は特に問題なくデータベースに接続できますね。 SqlConnection^ sqlConn = gcnew SqlConnection("Data Source=localhost;Initial Catalog=(データベース名);Integrated Security=True"); 失礼しました。アタッチにこだわらず試していただければと思います。

yamatonbo
質問者

お礼

>>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) で終了しました。 とありました。 何度も申し訳ございませんが、お時間のあるときに答えて下されば 幸いです。

関連するQ&A