【问题标题】:c# connectionstring property has not been initializedc#connectionstring属性未初始化
【发布时间】:2015-09-19 03:26:25
【问题描述】:

我已经构建了一个 DataGridView 并很好地读取了一个 sql 表。但是SqlDataAdapter.Update() 无法将数据更新回 SQL Server,出现错误:

connectionstring 属性尚未初始化

这是我的代码:

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 System.Data.SqlClient;

namespace test_2
{
  public partial class Form1 : Form
  {
    SqlDataAdapter sda;
    DataSet ds;
    BindingSource bind1 = new BindingSource();
    SqlCommandBuilder scb;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        using (SqlConnection cn = new     SqlConnection(Properties.Settings.Default.ConnString))
        {
            ShowData();
            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(sda);
            bind1.DataSource = ds;
        }
    }

    private void ShowData()
    {
        using (SqlConnection cn = new SqlConnection(Properties.Settings.Default.ConnString))
        {
           sda = new SqlDataAdapter("select key_seq, po_no, ref_no from mpo_master", cn);
            ds = new DataSet();
            sda.Fill(ds, "MPO");
            dataGridView1.DataSource = ds.Tables["MPO"]; 

        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            using (SqlConnection cn = new SqlConnection(Properties.Settings.Default.ConnString))
            {
        scb = new SqlCommandBuilder(sda);
                sda.Update(ds, "MPO");
                MessageBox.Show("Information Updated", "Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
  }
}

这是配置文件:

 <?xml version="1.0" encoding="utf-8" ?>
 <configuration>
     <configSections>
         <sectionGroup name="applicationSettings"       type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="VGB_Purchase.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
</configSections>
<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<applicationSettings>
    <VGB_Purchase.Properties.Settings>
        <setting name="connString" serializeAs="String">
            <value>Data Source=vgb-angus;Initial Catalog=VGB_Purchase;Persist Security Info=True;User ID=sa;Password=jessie</value>
        </setting>
    </VGB_Purchase.Properties.Settings>
</applicationSettings>

【问题讨论】:

  • 请分享您在配置文件中输入的连接字符串。当然,您可以非常小心地掩盖敏感信息,但我们会想看看您是如何构造字符串的。
  • 感谢 Sfugua,添加配置文件
  • 我怀疑@rachel-ambler 说得对。

标签: c# sql-server datagridview


【解决方案1】:

您的代码存在一些问题 - 未使用的连接实例,但最重要的是,您没有打开连接!

例如

private void ShowData()
{
    using (SqlConnection cn = new SqlConnection(Properties.Settings.Default.ConnString))
    {
       cn.Open();
       sda = new SqlDataAdapter("select key_seq, po_no, ref_no from mpo_master", cn);
       ds = new DataSet();
       sda.Fill(ds, "MPO");
       dataGridView1.DataSource = ds.Tables["MPO"]; 
       cn.Close();
    }
}

重新访问所有函数并删除您不使用它的 cn 初始化,例如

private void Form1_Load(object sender, EventArgs e)
{
    ShowData();
    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(sda);
    bind1.DataSource = ds;
}

另外我假设 sda 是一个类变量?从您的代码中不容易确定,我上面的示例假设它是。

最后,你绝对需要异常处理;我的示例只是插入了您丢失的 Open 调用。但是,您需要处理无法打开连接的时间。

注意:这只是一个示例,说明您应该如何根据给定的代码结构处理数据库调用。相应地适应更新。

【讨论】:

    【解决方案2】:

    上面的编码风格看起来不太好

    在您的代码中,即使在更新中创建连接对象,连接属性也没有设置

    如果您尝试创建类级别对象,请不要在 form_load 中创建连接对象时使用“using”关键字(不是一个好方法-但现在可以解决您的问题-您应该使用一些架构)

    要破坏对象,您可能必须在页面卸载时调用 dispose(这也不是一个好方法)

    【讨论】:

    • 不过,这些都不是问题的答案。确实,编码风格不是很好,但是您没有在这里回答关于为什么会发生错误的问题。此外,您的回答不会导致“但会暂时解决您的问题”的答案是 100% 不正确的。
    • 连接属性在加载完成后立即处理(因为使用了“using”关键字)。所以在更新部分它不可用。这就是原因。在更新中,他创建了另一个未分配给对象“sda”的连接对象。但他正在使用 sda 运行更新。这就产生了问题。为什么答案不正确?在我的建议中,我试图告诉他不要处理创建 form_load 的连接对象(当然 form_initialize 不能使用该对象),以便您可以在按钮单击中使用相同的连接。如果这样做。在表单卸载时调用连接处理
    • 另一种方法是分配他在按钮单击中创建的连接对象(比以前的最差)
    • 连接未打开是另一个问题。但它会正确地告诉“没有打开的连接错误”。这里的错误语句是“connectionstring property has not been initialized”
    • cn = new SqlConnection(); cn.ConnectionString = @"数据源=vgb-angus;初始目录=VGB_Purchase;持久安全信息=True;用户ID=sa;密码=jessie"; cn.Open();
    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多