存储过程名为"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();
}
}
我现在只能老老实实的用单线程来做,一旦用多线程就出错"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();
}
}
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.
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();
}
}}
和数据库有关,SQL2005及2008是可以通过同一个SqlConnection来同时执行多个操作,但是2000就不可以,每个SqlCommand都必须对应一个新的SqlConnection才可以,至少我找的资料都是这么说的....貌似2000不支持单一连接的多任务啊~~~