存储过程名为"SaveHistoryData",参数包括"Code" "Time" "Value"
我现在只能老老实实的用单线程来做,一旦用多线程就出错"System.InvalidOperationException"我的数据操作类class DataBase
    {
        private static string conStr = @"Data Source=127.0.0.1;Initial Catalog=123;Persist Security Info=True;User ID=123;Password=123";
        private static SqlConnection sqlCon;        public static bool Connection()
        {
            try
            {
                sqlCon = new SqlConnection(conStr);
                sqlCon.Open();
                return true;
            }
            catch
            { return false; }
        }        public static void SaveData(BasicData bd)
        {            SqlCommand sqlCmd = new SqlCommand("SaveHistoryData", sqlCon);
            sqlCmd.CommandType = CommandType.StoredProcedure;
      
            sqlCmd.Parameters.Add(new SqlParameter("Code", bd.Code.ToString()));
            sqlCmd.Parameters.Add(new SqlParameter("Time", bd.Time.ToString("yyyy-MM-dd HH:mm:ss")));
            sqlCmd.Parameters.Add(new SqlParameter("Volume", bd.V.ToString()));            sqlCmd.ExecuteNonQuery();
        }        public static void Close()
        {
            sqlCon.Close();
        }
    }

解决方案 »

  1.   


        class DataBase
        {
            private static string conStr = ...
            private static SqlConnection sqlCon;  //<--- possible problem
            ...
        }Different thread should use different connection, a static connection could leave you troubles.
      

  2.   

    经测试
    Different thread can use different connection.在你原来的代码中 没有初始化 conStr,我添加了静态构造函数来初始化conStr,没有使用你写的存储过程,但是执行sql语句没有问题并且插入成功,这说明你的这种写法是可以,可能是你那个地方代码还有其他的bug。
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data.SqlClient;
    using System.Threading;
    using System.Data;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConsoleApplication1.DataBase.BasicData bd = new DataBase.BasicData();
                bd.Code = "";
                bd.Time = new DateTime();
                bd.V = 1;            DataBase.SaveData(bd);            Thread t = new Thread(new ParameterizedThreadStart(DataBase.SaveData));
                t.Start(bd);
            }
        }
        class DataBase
        {
            private static string conStr = @"Data Source=127.0.0.1;Initial Catalog=123;Persist Security Info=True;User ID=sa;Password=User@123";
            private static SqlConnection sqlCon;
            static DataBase()
            {
                try
                {
                    conStr = @"Data Source=127.0.0.1;Initial Catalog=123;Persist Security Info=True;User ID=sa;Password=User@123";
                    sqlCon = new SqlConnection(conStr);
                    sqlCon.Open();
                    
                }
                catch(Exception err)
                {
                    throw err;
                }
            }
            public static bool Connection()
            {
                try
                {
                    sqlCon = new SqlConnection(conStr);
                    sqlCon.Open();
                    return true;
                }
                catch
                { return false; }
            }        public class BasicData
            {
                public string Code;
                public DateTime Time;
                public int V;
            }       
            public static void SaveData(object obj)
            {
                BasicData bd = obj as BasicData;
                SqlCommand sqlCmd = new SqlCommand("SaveHistoryData", sqlCon);
                sqlCmd.CommandText = "insert into tab_test values ('1')";
                sqlCmd.CommandType = CommandType.Text;
                //sqlCmd.CommandType = CommandType.StoredProcedure;            //sqlCmd.Parameters.Add(new SqlParameter("Code", bd.Code.ToString()));
                //sqlCmd.Parameters.Add(new SqlParameter("Time", bd.Time.ToString("yyyy-MM-dd HH:mm:ss")));
                //sqlCmd.Parameters.Add(new SqlParameter("Volume", bd.V.ToString()));            try
                {
                    sqlCmd.ExecuteNonQuery();
                }
                catch(Exception err)
                { 
                }
            }        public static void Close()
            {
                sqlCon.Close();
            }
        }}
      

  3.   


    和数据库有关,SQL2005及2008是可以通过同一个SqlConnection来同时执行多个操作,但是2000就不可以,每个SqlCommand都必须对应一个新的SqlConnection才可以,至少我找的资料都是这么说的....貌似2000不支持单一连接的多任务啊~~~
      

  4.   

    BeginExecute(). Begin....();  End....()
      

  5.   

    忘了告诉楼主我连得是sql 2005