C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

iniファイルの読込んでDB接続しようとすると落ちる

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■85526 / inTopicNo.1)  iniファイルの読込んでDB接続しようとすると落ちる
  
□投稿者/ YM (1回)-(2017/11/02(Thu) 10:55:55)

分類:[C#] 

下記のように、直書きならSQLServerに接続されます

//データベース接続情報
private const string DATABASE_SERVER = "XXX.XXX.XXX.XXX";
private const string DATABASE_NAME = "";
private const string DATABASE_USER = "???";
private const string DATABASE_PASSWORD = "???";

public static Boolean OpenConnection()
{

// 接続文字列を生成する
string connectString =
"Data Source = " + DATABASE_SERVER
+ ";Initial Catalog = " + DATABASE_NAME
+ ";User ID = " + DATABASE_USER
+ ";Password = " + DATABASE_PASSWORD;

// SqlConnection の新しいインスタンスを生成する (接続文字列を指定)
connection = new System.Data.SqlClient.SqlConnection(connectString);

try
{
// データベース接続を開く
connection.Open();
clsLog.WriteLog(0, "SQLServer データベース接続しました。");

}
catch (Exception ex)
{
clsLog.WriteErrLog(ex);
clsMessage.ShowMessage("SQLServer DB接続に失敗しました。\n" + ex.Message);
return false;
}
return true;
}

下記の要領で、iniファイルに書き込むようにすると読み込みに失敗します。
iniファイルの内容は読み込めています
エラー内容
「SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 (provider: Named Pipes Provider, error: 40 - SQL Server への接続を開けませんでした)」

[DllImport("KERNEL32.DLL")]
private static extern uint GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString,
uint nSize,
string lpFileName);

//データベース接続情報
    private static string DATABASE_SERVER { get; set; }
private static string DATABASE_NAME { get; set; }
private static string DATABASE_USER { get; set; }
private static string DATABASE_PASSWORD { get; set; }

public static string GetIniString(string lpSection, string lpKeyName, string lpFileName)
{
System.Text.StringBuilder strValue = new System.Text.StringBuilder(1024);

uint sLen = GetPrivateProfileString(lpSection, lpKeyName, "", strValue, 1024, lpFileName);

return strValue.ToString();
}

public static Boolean AAA()
{
DATABASE_SERVER = GetIniString("DB", "DATABASE_SERVER", FilePath);
DATABASE_NAME = GetIniString("DB", "DATABASE_NAME", FilePath);
DATABASE_USER = GetIniString("DB", "clsBasCommon.DATABASE_USER", FilePath);
DATABASE_PASSWORD = GetIniString("DB", "DATABASE_PASSWORD", FilePath);

return true;
}

public static Boolean OpenConnection()
{

// 接続文字列を生成する
string connectString =
"Data Source = " + DATABASE_SERVER
+ ";Initial Catalog = " + DATABASE_NAME
+ ";User ID = " + DATABASE_USER
+ ";Password = " + DATABASE_PASSWORD;

// SqlConnection の新しいインスタンスを生成する (接続文字列を指定)
connection = new System.Data.SqlClient.SqlConnection(connectString);

try
{
// データベース接続を開く
connection.Open();
clsLog.WriteLog(0, "SQLServer データベース接続しました。");

}
catch (Exception ex)
{
clsLog.WriteErrLog(ex);
clsMessage.ShowMessage("SQLServer DB接続に失敗しました。\n" + ex.Message);
return false;
}
return true;
}

エラー原因がわかりません


よろしくお願いします
引用返信 編集キー/
■85530 / inTopicNo.2)  Re[1]: iniファイルの読込んでDB接続しようとすると落ちる
□投稿者/ kaina (34回)-(2017/11/02(Thu) 13:05:39)
とりあえず、connectStringをデバッグで確認して
比較してみてはいかがですか?
引用返信 編集キー/
■85532 / inTopicNo.3)  Re[1]: iniファイルの読込んでDB接続しようとすると落ちる
□投稿者/ 774RR (572回)-(2017/11/02(Thu) 13:30:25)
GetPrivateProfileString のような化石を使わなきゃならないのはご愁傷様なんだが・・・

とりあえず GetPrivateProfileString に失敗してるんぢゃないの?
取得結果や生成した接続文字列を System.Diagnostics.Debug.WriteLine で表示してみると良いかもしれない。

っていうか DllImport の属性指定がたらないんぢゃ・・・
CharSet=Charset.Unicode, CallingConvention=CallingConvention.StdCall とか抜けてる。
ExactSpelling = true も指定して GetPrivateProfileStringW() を使うほうをお勧め。

接続文字列を外部からの入力で作るのって怖くない?
SQL injection ならぬ connection injection になりそうな気のせいがするけど。
引用返信 編集キー/
■85533 / inTopicNo.4)  Re[1]: iniファイルの読込んでDB接続しようとすると落ちる
□投稿者/ WebSurfer (1329回)-(2017/11/02(Thu) 15:09:20)
No85526 (YM さん) に返信

接続文字列の違いが原因であろうと思いますが、成功するときと失敗するときとで接続文字列がどうな
るかの情報を提供できませんか?

あと、何を作っているか(Windows Forms? コンソールアプリ? その他?)と環境(特に SQL Server
のバージョンとエディション、アプリからの接続プロトコル)ぐらいは書いてください。

少ない情報で想像を膨らませると、

(1) うまくいくケースではサーバーに IP アドレスを指定しているので名前解決は不要で tcp 接続で
  できる。

  注:IP アドレスを指定すると tcp で接続に行くようです。詳しくは以下の記事参照:

    IP アドレスで SQL Server に接続
    http://surferonwww.info/BlogEngine/post/2016/03/18/connecting-to-sql-server-using-ip-address-instead-of-server-name.aspx


(2) ダメなケースではサーバーにサーバー名を指定していてそれで名前解決ができず接続に失敗する

・・・ということではなかろうかと思われます。

(だから np 何とかというエラーになっている)

エラーメッセージで "provider: Named Pipes Provider" となっているのは、多分以下のすれっどのよう
な話で、tcp でトライして失敗し、次に np でトライして失敗したからではなかろうかと思います。

アプリケーションからSQLServerへの接続プロトコル(名前付きパイプ)について
https://social.msdn.microsoft.com/Forums/ja-JP/fe9913e6-d04e-48b5-b756-69a2a0ea70ff/sqlserver?forum=sqlserverja

SQL Server 接続プロトコル順序
http://surferonwww.info/BlogEngine/post/2016/11/16/sql-server-connection-protocol-order.aspx
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ