开发者社区> 问答> 正文

C#实现delphi程序中DBConn.udl数据库链接工具,请高手解答疑惑:报错

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using StudentManager.com.huixin.util;
using System.Collections;
using System.Data.ProviderBase;
using SQLDMO;
using System.Data.SqlClient;

namespace StudentManager
{
    public partial class DataSourceConfig : Form
    {
        //连接数据库的类型
        private String sqlConType = "";
        public DataSourceConfig()
        {
            InitializeComponent();
        }

        //配置数据库链接的窗体关闭时,打开相对应登录窗体
        private void DataSourceConfig_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                //杀死进程
                //System.Diagnostics.Process.GetCurrentProcess().Kill();
                //关闭当前窗体
                //终止当前进程并为基础操作系统提供指定的退出代码
                //System.Environment.Exit(System.Environment.ExitCode);
                this.Dispose();
                this.Close();                
                //打开登录窗体
                LoginForm lf = new LoginForm();
                lf.Show();
                //
                LoginForm.loginFrm.Show();
                
            }
            catch (Exception ex)
            {
                Console.WriteLine("连接数据的窗体进程出错了:" + ex.Message);
            }
        }

        //显示组合框的下拉部分时发生
        private void comboBox1_DropDown(object sender, EventArgs e)
        {
            this.comboBox1.DataSource = SqlLocator.GetLocalSqlServerNamesWithSqlClientFactory();
            this.comboBox1.DisplayMember = "ServerName";
        }

        //当用户点击刷新按钮时,将局域网内服务器和实例名给comobox
        private void button1_Click(object sender, EventArgs e)
        {
            this.comboBox1.DataSource = SqlLocator.GetLocalSqlServerNamesWithSqlClientFactory();
            this.comboBox1.DisplayMember = "ServerName";
        }

        //在窗体加载时,将Sql Server按钮以及和他相关两个文本框禁用
        private void DataSourceConfig_Load(object sender, EventArgs e)
        {
            //Windows的按钮默认被选中
            this.radioButton1.Select();
            this.textBox1.Enabled = false;
            this.textBox2.Enabled = false;
        }

        private void radioButton1_Click(object sender, EventArgs e)
        {
            if (this.radioButton1.Checked == true) {
                sqlConType = "0";
            }
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            if (this.radioButton2.Checked == true)
            {
                sqlConType = "1";
                this.textBox1.Enabled = true;
                this.textBox2.Enabled = true;
            }
        }

        //3.点击数据库链接时显示时,组合框的下拉部分时发生
        private void comboBox2_DropDown(object sender, EventArgs e)
        {
            //通过第一步输入的服务器实例名,从而找到步骤三中的数据库
            //通过判断用户点击的属于哪一种数据库连接方式,从而判断采用什么方法
            if (sqlConType == "0") {  //用户选择的是Windows方式
                this.comboBox2.DataSource = GetDataBaseList(this.comboBox1.SelectedItem.ToString());
                this.comboBox2.DisplayMember = "";
            }
            else if (sqlConType == "1") { //用户选择了Sql Server方式
                this.comboBox2.DataSource = GetDataBaseList(this.comboBox1.SelectedItem.ToString(),this.textBox1.Text.Trim().ToString(),this.textBox2.Text.Trim().ToString());
                this.comboBox2.DisplayMember = "";
            }
        }

        //得到指定SQL服务器所有数据库的列表
        //这种输入Sql Server模式,需要用户名和密码
        public ArrayList GetDataBaseList(string ServerName, string UserName, string Pwd)
        {
            //一般使用SQLDMO,只能用于sql server2005一般的版本
            ArrayList list = new ArrayList();
            SqlConnection conn = new SqlConnection("Uid=" + UserName + ";Pwd=" + Pwd + ";Data Source=SQL2012;Integrated Security=false;"); ;
            SqlCommand cmd = new SqlCommand("select name from sys.databases where database_id > 4", conn); ;
            try
            {
                if (conn.State == ConnectionState.Closed){
                    conn.Open();
                    SqlDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                        list.Add(dr[0]);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (conn != null && conn.State == ConnectionState.Open)
                {
                    conn.Close();
                    conn.Dispose();  //释放资源
                }
            }
            /**
            SQLDMO.Application sqlApp = new SQLDMO.Application();
            SQLDMO.SQLServer oServer = new SQLDMO.SQLServer("Data Source="+ServerName+";Persist Security Info=True;UID="+UserName+";PWD="+Pwd+"");
            oServer.Connect(ServerName,UserName,Pwd);
            foreach (SQLDMO.Database db in oServer.Databases)
            {
                if ((db.Name != null) && (db.SystemObject == false))
                {
                    list.Add(db.Name);
                }
            }
            **/
            return list;
        }

        //这种属于Windows方式
        //此时链接数据库时,需要加integrated security=SSPI
        public ArrayList GetDataBaseList(string ServerName)
        {
            //一般使用SQLDMO,只能用于sql server2005一般的版本
            ArrayList list = new ArrayList();
            SqlConnection conn = new SqlConnection("Data Source=" + ServerName + ";Integrated Security=SSPI;Initial Catalog=mwyqms_2016-03-25");
            SqlCommand cmd = new SqlCommand("select name from sys.databases where database_id > 4", conn); ;
            try
            {
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                    SqlDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                        list.Add(dr[0]);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (conn != null && conn.State == ConnectionState.Open)
                {
                    conn.Close();
                    conn.Dispose();  //释放资源
                }
            }
            return list;
        }


        

    }
}



 第1步可以获取所有区域网内的服务器名,但是第三步骤无法从特定的服务器名下,通过用户名和密码,得到数据库

   代码:

     

展开
收起
kun坤 2020-06-06 15:00:15 749 0
1 条回答
写回答
取消 提交回答
  • debug的时候,获取database的那一段,连接通了没?######@zabcd117 应该不是sql的问题,是IIS7啥啥的######回复 @浮萍一生世 : 我没有办法帮你,因为我都没有net环境。问题是,你要确定是你的sql语句的问题还是其他问题。######就是那一段没有通。你有没有时间,我把源码发给你,你帮忙看看。

    2020-06-06 15:00:23
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载