我是C#的新手。事实上,这是我用这种特殊语言的第一个项目。
在以下代码中:
namespace FuelBurnImport {
class DataWriter {
private string qs = "SELECT * FROM fuel_burn_data_meta;";
public DataWriter(BurnDataHeader bdh, BurnDataFlight bdf) {
SqlConnection cn = OpenCN();
// work in progress. more to be added here...
}
private SqlConnection OpenCN() {
private string cs = @"Data Source=server; APP=FuelBurnImporter; Initial Catalog=database; Integrated Security=true";
return new SqlConnection(cs).Open();
}
}
}
我在OpenCN()
私有方法
OpenCN()
方法声明显示Not all code paths return a
value
{
方法声明后的OpenCN() {
说expected
"}"
行private string cs
的结尾也说expected "}"
cs
中的new SqlConnection(cs)
说does not exist in current
context
new SqlConnection(cs).Open()
错误说"命名空间无法直接包含成员..."
但是,如果我从private
前面删除private string cs
,则所有这些错误都会消失,而且看起来很开心。
我是否以某种方式滥用private
方法?我是否滥用私人字符串声明?我有一种感觉,即使我从字符串字段声明前删除private
,它仍然会破坏。
答案 0 :(得分:2)
方法中的字符串声明是本地的,因此将其设为私有是没有意义的。因此,您在此处使用private
关键字提交语法错误(在我看来,语义错误)。变量cn不可能泄漏,因为它无法从其他方法中访问,同一个对象的不同实例在同一个对象上有不同的“cs”事物(我不确定但你可以在方法之外创建一个private static const
字符串如果你真的想在变量的声明中看到“私有”,那么在方法中使用它。
先修复此问题。
在实际返回之前,“using”语句将自动关闭连接,并且您将返回已关闭的连接。这可能会也可能不会导致语法错误,但如果确实如此,我会说它应该更明确。
答案 1 :(得分:0)
使用块"}" - 返回null因为使用块只返回值而不是函数
无需在函数内声明私有字符串
更好的方式实现功能
private SqlConnection OpenCN()
{
string cs = @"Data Source=server; APP=FuelBurnImporter; Initial Catalog=database; Integrated Security=true"; SqlConnection cn = new SqlConnection(cs);
cn.Open();
return cn;
}
答案 2 :(得分:0)
https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx
答案 3 :(得分:0)
请勿将using
放入OpenCN
。 using
确保处理创建的变量。如果你这样做,你将返回一个已经关闭的SqlConnection
。
相反,请将OpenCN
更改为:
private SqlConnection OpenCN()
{
var cs = @"Data Source=server; APP=FuelBurnImporter; Initial Catalog=database; Integrated Security=true";
var cn = new SqlConnection(cs);
cn.Open();
return cn;
}
另外,不要从构造函数中调用OpenCN
。当您创建DataWriter
的实例时,这将创建一个打开的连接。在您需要之前,请勿创建和打开连接。这样你就可以创建它,打开它,使用它,然后尽快处理它(它也会关闭它)。
无论采用哪种方法实际执行某些SQL,都要在那里创建连接。如果您从那里拨打OpenCN
,那么您可以
using(var connection - OpenCN())
{
//execute your SQL using the connection
}
答案 4 :(得分:0)
关于您的错误,只需从连接字符串声明中删除private关键字:
private string cs = @"Data Source=server; APP=FuelBurnImporter; Initial Catalog=database; Integrated Security=true";
但是,您会遇到一些问题,因为您的连接会在使用完成后立即关闭。此外,不建议长时间打开您的连接。只需创建using语句,并在需要执行查询时打开连接。