0

我正在编写连接到数据库的 C# 应用程序,进行耦合选择,然后将记录插入网络中的服务器。

但是我有大约 40k 条记录,我的程序处理一个记录,比如 1 秒。

我不知道如何提高性能。这是我的 sql getter 和 inserter。有什么建议么?

    public bool insert_and_ConfirmSQL(String Query, String comments)
    {
        bool success = false;
        NpgsqlCommand cmd = new NpgsqlCommand();
        NpgsqlConnection mycon = new NpgsqlConnection();
        string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
        mycon.ConnectionString = connstring;
        cmd = mycon.CreateCommand();
        cmd.CommandText = Query;
        mycon.Open();

        int temp = 0;
        try
        {
            temp = cmd.ExecuteNonQuery();
            success = true;
        }
        catch
        {
            success = false;
        }
        finally
        {
            if (mycon.State.ToString() == "Open")
            {
                mycon.Close();
            }
        }
        return success;
    }


    public String getString(String sql, NpgsqlConnection conn)
    {
        using (DataSet ds = new DataSet())
        {
            using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn))
            {
                da.Fill(ds);
                if (ds.Tables.Count > 0)
                {
                    DataTable dt = ds.Tables[0];
                    //  check count of Rows 
                    if (dt.Rows.Count > 0)
                    {
                        object o = dt.Rows[0][0];
                        if (o != DBNull.Value && o != null)
                        {
                            return o.ToString();
                        }
                    }
                }
            }
        }
        // Return default value 
        return "";
    }
4

2 回答 2

3

没有机会帮助您处理 sql 语句,因为我们不知道它们。

唯一(猜测)可见的问题是您每次都尝试使用新连接循环 40K 记录(您知道如何)。作为您的代码提供的两个例程正是这样做的。那么你需要 40K 调用 insert_and_ConfirmSQL 和/或另外 40K 调用 getString 例程吗?

如果您真的循环,则更新您的代码以仅使用一个连接而不关闭它;数据集也可以这样做(使用前必须清除它:ds.Clear())。

不用说,如果您的查询很大(就数据而言),和/或索引不涵盖查询,那么预计会出现延迟。

试试这种方法,让我们知道。

于 2012-06-22T16:36:31.263 回答
2

有时您可以通过使用 sql Datareader 而不是 DataSet 来提高性能。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader(v=vs.100).aspx#Y0

然后,您可以在从数据库中读取数据时检查数据。

所以我会用 DataReader 实现上面的代码并重新计时。

编辑:尤其是那个 getString 方法。如果 ds.Fill 占用了 40k 行,这可能是您的性能问题的原因。

于 2012-06-22T16:28:37.640 回答