iT邦幫忙

0

請問一個專案同時連接兩個資料庫

  • 分享至 

  • xImage

下面是我的程式其中的code

private static string Constr = @"Data Source=*.*.*.*;Initial Catalog=****;Persist Security Info=True;User ID=***;Password=***";
        private static string Constr2 = @"Data Source=*.*.*.*;Persist Security Info=True; User ID= *;Password=*;";
        
string sql = @"SELECT TOP 1 * FROM ***** ORDER BY DataTime DESC";       
                string sq2 = @"SELECT TOP 1 *** FROM **** WHERE DP_NO = '**' ORDER BY M_DateTime DESC";
                
                
DataTable dt = SqlCommand(sql);
DataTable dt2 = SqlCommand(sq2);


dt.Dispose();
dt2.Dispose();

  protected static DataTable SqlCommand(string Sqlstr)  
        {
            DataTable dt = new DataTable();
            try
            {
                SqlConnection conn = new SqlConnection(Constr);

                SqlDataAdapter da = new SqlDataAdapter(Sqlstr, conn);
                da.Fill(dt);
                conn.Close();
                return dt;

            }

 catch (Exception ex)
            {
                return dt;
            }
        }
        
         protected static DataTable SqlCommand2(string Sqlstr2)  
            {
                DataTable dt2 = new DataTable();
                try
                {

                    SqlConnection conn2 = new SqlConnection(Constr2);
                    SqlDataAdapter da = new SqlDataAdapter(Sqlstr2, conn2);
                    da.Fill(dt2);
                    conn2.Close();
                    return dt2;
                }

                catch (Exception ex2)
                {
                    return dt2;
                }
            }

裡面有一些我一些功能我就省略沒貼了
只是我爬文後結果是連兩個資料庫要兩個字串,然後變數修改一下就好了
然後都有問題
兩個是不同資料庫IP,User,密碼,DB,都不同
https://ithelp.ithome.com.tw/upload/images/20180711/20109425g73lS68VjL.jpg

Luke iT邦研究生 5 級 ‧ 2018-07-11 09:48:03 檢舉
您的問題是什麼?

是去DB 取資料有問題?
是兩個資料 合併有問題?
是 EXCEL 轉圖檔有問題?


還是您要告訴大家
SqlCommand 跟 SqlCommand2
CODE 是一樣? 可以不用重複寫?
ted8224 iT邦新手 5 級 ‧ 2018-07-11 09:50:20 檢舉
不是...
如果單一資料庫,可以
因為要連接多個資料庫
多一個資料庫,字串
就變如圖所示
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2

沒用過c# 直接寫sql,連接過兩個DB,一般會用設定在web.config的方式,
不過仔細看看你的程式碼,其實有個地方寫錯了,所以不會查詢正確,
另外DataTable為何需要宣告成全域變數?
web.config設定

  <appSettings>
    <add key="MSSQLConfig" value="Data Source=localhost;Initial Catalog=DB1;User ID=test1;Password=test1;Connect Timeout=1000;" />
    <add key="MSSQL1Config" value="Data Source=localhost;Initial Catalog=DB2;User ID=test2;Password=test2;Connect Timeout=1000;" />
    </appSettings>

程式碼調整

protected static DataTable SqlCommand(string Sqlstr)  
{
    DataTable dt = SqlCommand(sql);  //這個沒有用到
    DataTable dt = new DataTable(); //這是錯的
    try
    {
        SqlConnection conn = new SqlConnection(Constr);
        SqlDataAdapter da = new SqlDataAdapter(Sqlstr, conn);
        da.Fill(dt);
        conn.Close();
        dt.Dispose(); //這個放置的位置,再自行測試
        return dt;
    }
     catch (Exception ex)
    {
        return dt;
    }
}
        
protected static DataTable SqlCommand2(string Sqlstr2)  
{
    DataTable dt2 = SqlCommand(sq2);  //這個沒有用到
    DataTable dt2 = new DataTable();  //這是錯的
    try
    {
        SqlConnection conn2 = new SqlConnection(Constr2);
        SqlDataAdapter da = new SqlDataAdapter(Sqlstr2, conn2);
        da.Fill(dt2);
        conn2.Close();
        dt2.Dispose(); //這個放置的位置,再自行測試
        return dt2;
    }
    catch (Exception ex2)
    {
        return dt2;
    }
}
看更多先前的回應...收起先前的回應...
ted8224 iT邦新手 5 級 ‧ 2018-07-11 09:48:47 檢舉

我是用WinForm
去連接資料庫的
不是Web
謝謝回答

原來如此,所以那樣調整有達到你的需求?

Luke iT邦研究生 5 級 ‧ 2018-07-11 09:56:51 檢舉

【另外DataTable為何需要宣告成全域變數?】

public static DataTable dt2 = new DataTable();
有嗎?/images/emoticon/emoticon21.gif

宣告在function外,對這個class而言就是全域的變數啊
/images/emoticon/emoticon10.gif

ted8224 iT邦新手 5 級 ‧ 2018-07-11 10:04:33 檢舉

謝謝回答
不過沒幫倒忙
我已經有

 protected static DataTable SqlCommand(string Sqlstr)

所以不用

DataTable dt = SqlCommand(sql)

他會秀Bug說已經有了

Luke iT邦研究生 5 級 ‧ 2018-07-11 10:06:56 檢舉

程式碼調整

private static string Constr = @"Data Source=*.*.*.*;Initial Catalog=****;Persist Security Info=True;User ID=***;Password=***";
private static string Constr2 = @"Data Source=*.*.*.*;Persist Security Info=True; User ID= *;Password=*;";

string sql = @"SELECT TOP 1 * FROM ***** ORDER BY DataTime DESC";       
string sq2 = @"SELECT TOP 1 *** FROM **** WHERE DP_NO = '**' ORDER BY M_DateTime DESC";
                
                
DataTable dt = SqlCommand(Constr,sql);
DataTable dt2 = SqlCommand(Constr2,sq2);

protected static DataTable SqlCommand(string constr, string Sqlstr)  
{
    DataTable dt = new DataTable();
    try
    {
        using (SqlConnection conn = new SqlConnection(constr))
        {
        SqlDataAdapter da = new SqlDataAdapter(Sqlstr, conn);
        da.Fill(dt);
        }
    }
     catch (Exception ex)
    {
        throw;
    }
    return dt;
}
ted8224 iT邦新手 5 級 ‧ 2018-07-11 10:28:50 檢舉

@ TWLuKe
正確解答~!
太感謝您了
可惜是留言 我無法標記您

不過我是把您給的幾乎複製貼上

其實不太懂我這樣會撈不到..怪怪

關鍵是 SqlCommand(Constr,sql);這個吧,另外
下面這兩個不是重覆宣告了嗎? 這樣會對?

DataTable dt = SqlCommand(Constr,sql);
DataTable dt = new DataTable();
0
Luke
iT邦研究生 5 級 ‧ 2018-07-11 10:13:08

錯誤訊息
您可以點 EX.Message
看看是什麼錯誤

按照您的圖
EX.Message https://ithelp.ithome.com.tw/upload/images/20180711/20096781oFTZvJPsfe.png

資料是空的?
位置 0

不知道您寫的完整 CODE
先告訴您 ==>Dispose明確與記憶體回收行程釋放unmanaged 的資源

dt.Dispose();
dt2.Dispose();
ted8224 iT邦新手 5 級 ‧ 2018-07-11 10:30:15 檢舉

謝謝回復
@ TWLuKe
這位大大
我使用他的方法已經成功
感謝回復

ted8224 iT邦新手 5 級 ‧ 2018-07-11 10:30:16 檢舉

謝謝回復
@ TWLuKe
這位大大
我使用他的方法已經成功
感謝回復

0
小魚
iT邦大師 1 級 ‧ 2018-07-11 12:03:01

連接兩個資料庫,
要用兩個不同的SqlConnection,
請問您有用了嗎?
另外,
建議Catch的地方要用ex.ToString()將錯誤訊息讀出來,
要不然就只能擲杯了...
https://ithelp.ithome.com.tw/upload/images/20180711/20105694zUS5Rr0HaZ.jpg

看更多先前的回應...收起先前的回應...
ted8224 iT邦新手 5 級 ‧ 2018-07-11 13:19:29 檢舉

謝謝回復
@ TWLuKe
這位大大
我使用他的方法已經成功
感謝回復

Homura iT邦高手 1 級 ‧ 2018-07-11 13:42:50 檢舉

ted8224
你應該要去弄懂為什麼
不是說使用了這個方法成功了就算了....

ted8224 iT邦新手 5 級 ‧ 2018-07-11 13:59:03 檢舉

@Homura
是阿..
只是我單純連一個資料庫 就對
連2個就出錯
用版上大大方法@ TWLuKe
就成功
我看一看好像差異不大
但就..

你有好好看過自己的code嗎?

DataTable dt = SqlCommand(sql);
DataTable dt2 = SqlCommand(sq2);

SqlCommand跟SqlCommand2兩個function去連接兩個不同的資料庫
然後你兩個都去call SqlCommand,第二個當然會出錯
如果是要應付學校作業就算了
如果要吃這行飯,好歹學一下除錯工具怎麼用吧。

ted8224 iT邦新手 5 級 ‧ 2018-07-12 09:19:03 檢舉

@rainbowrain 謝謝大大 受益良多

我要發表回答

立即登入回答