首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的应用程序在更新数据库记录时挂起?

为什么我的应用程序在更新数据库记录时挂起?
EN

Stack Overflow用户
提问于 2011-08-29 18:29:06
回答 2查看 657关注 0票数 0

以下应用程序代码在更新数据库记录时挂起。输出画面只显示0,程序永远挂起。但是,表中有超过50,000条记录。(程序将ISCII代码转换为UNICODE,并将其写回数据库。)

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Data.SqlClient;
using System.Data.Sql;

namespace demoupdateform
{
public partial class Form1 : Form
{
    System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test1.txt");

    String[,] harltabcol = new String[,]
        {
            {"Col_name","Table_name"}

        };

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        SqlConnection cn = new SqlConnection("Password=admin;Persist Security Info=True;User ID=sa;Initial Catalog=dbname;Data Source=DEEPAK-87E8B4");
        SqlConnection cn1 = new SqlConnection("Password=admin;Persist Security Info=True;User ID=sa;Initial Catalog=dbname;Data Source=DEEPAK-87E8B4");



        string temp;
        string temp1;
        try
        {

            for (int i = 0; i < harltabcol.GetLength(0); i++)
            {

                    cn.Open();


                SqlCommand cmdSel = new SqlCommand( "select [" + harltabcol[i, 0] + "] from [" + harltabcol[i, 1] + "]",cn);
                //cn.Open();
                SqlDataReader rdr = cmdSel.ExecuteReader();
                progressBar1.Value = 0;
                int j = 0;
                while (rdr.Read())
                {

                    temp = (rdr[harltabcol[i, 0]].ToString()).ToString();

                    temp1 = (Iscii2Unicode(temp)).ToString();
                    SqlCommand cmdUpd = new SqlCommand("UPDATE [" + harltabcol[i,1] + "] SET [" + harltabcol[i,0] + "] =N'"+temp1+"' WHERE " + harltabcol[i,0] + "='" + temp + "'",cn1);
                    temp = rdr[harltabcol[i, 0]].ToString();
                    cn1.Open();
                    cmdUpd.CommandTimeout = 0;
                    Console.WriteLine(j++);
                    file.WriteLine(temp+" --> "+temp1);
                    progressBar1.Value = progressBar1.Value + 1;

                    if (progressBar1.Value == 99)
                        progressBar1.Value = 0;

                    cmdUpd.ExecuteNonQuery();
                    temp = null;
                    temp1 = null;
                    cn1.Close();
                }
                progressBar1.Value = 100;
                cn.Close(); 
            }


        }
        catch (Exception ex)
        {

            MessageBox.Show("Error Occured " + ex.ToString());
        }


    }
    public string Iscii2Unicode(string IsciiStr)
    {
        Encoding EncFrom = Encoding.GetEncoding(1252);
        Encoding EncTo = Encoding.GetEncoding(57002);
        Byte[] b = EncFrom.GetBytes(IsciiStr);

        return EncTo.GetString(b);
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }
}
}
EN

回答 2

Stack Overflow用户

发布于 2011-08-29 18:32:32

很正常。您没有给消息循环一个运行的机会。使用BackgroundWorker处理数据库查询,并调用ProgressChanged更新图形用户界面。

票数 4
EN

Stack Overflow用户

发布于 2011-08-29 18:45:23

在你的代码中,你访问了while循环中的数据库,这会导致你的程序挂起。因此,您可以创建一个大型update查询并调用Command.Execute一次。这可能不是最好的解决方案,但它将节省每次迭代打开和关闭数据库连接的时间。

代码语言:javascript
复制
StringBuilder updateQuery = new StringBuilder("");
while (rdr.Read())
{
   temp = (rdr[harltabcol[i, 0]].ToString()).ToString();
   temp1 = (Iscii2Unicode(temp)).ToString();
   updateQuery.Append("UPDATE [" + harltabcol[i,1] + "] SET [" + harltabcol[i,0] + "] =N'"+temp1+"' WHERE " + harltabcol[i,0] + "='" + temp + "';");
} 
SqlCommand cmdUpd = new SqlCommand(updateQuery.ToString(),cn1);
cn1.Open();
cmdUpd.CommandTimeout = 0;
cmdUpd.ExecuteNonQuery();
temp = null;
temp1 = null;
cn1.Close();
cn.Close(); 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7228910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档