设置全局变量问题

dongsheng10101 2018-12-19 10:12:04
大家好,我是C#初学者:
Program.cs:
namespace SunPDA
{
public class SunGlobal
{
public static string strUser { get; set; }
public static string strAct { get; set; }
public static string strConn {get{return "Data Source=192.168.1.241

;Initial Catalog=SunDB;User Id=sa;Password=sa";}}
public static SunConnDB MyConnDB = new SunConnDB(); //方法一,
}

public class SunConnDB
{
public SqlConnection MyConn;
public SqlCommand MyCmd;

//public static SunConnDB MyConnDB = new SunConnDB(); //方法二:两句注释代码
public SunConnDB()
{
MyConn = new SqlConnection(SunGlobal.strConn);
MyCmd = new SqlCommand();
MyCmd.Connection = MyConn;
//MyConnDB = this;
}
}

static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[MTAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}
-------------------------
我的想法是:
strUser、strAct:在软件登录成功后,把当前用户与权限数据分别存放到这两全局属性中。
strConn:连接数据库字符串,软件其它地方要连数据库,就访问此属性。

类SunConnDB:主要是把SqlConntion、SqlCommand两控件弄个全局对象,这样在其它窗口中,就少创建此两控件对象。

现经测试,方法一、方法二,程序运行都没问题,(本人采用方法一)

请问,我这样写代码是否有不合理的地方,或理解错误?



另外:
在BCB中,SQL语句写法是:String strSql="select * from TPADBA where DBA001=" + QuotedStr(Edit1->Text);
在C#中,SqlCommand.CommandText ="select * from TPADBA where DBA001='" + textBox1.Text.Replace("'", "''") + "'";
请问,除了这种写法外,还有没有更方便的函数来实现啊?
...全文
355 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
关于static的问题,我们开发软件一般都是客户端访问自己开发的服务器,而不是桌面客户端去调用 ado.net 访问关系数据库。我们的软件都是基于互联网思维方式来设计的,而不是基于小办公室里的局域网来考虑的。因此数据库操作代码在服务器,而且是高并发的。 假设你的数据库操作代码异常简单,使用 static 变量引用连接对象也未尝不可。总之编程是以测试为准,不是一开始就以书本为准。当你改变自己的位置参加不同项目开发,真理总是有可能被改变的。以测试为准,学会提前设计和编写大规模测试代码,而不是仅仅会编写几行程序代码。
xuzuning 2018-12-21
  • 打赏
  • 举报
回复
C#中多用参数化查询,所以就没提供 Quote(转义)方法
xuzuning 2018-12-21
  • 打赏
  • 举报
回复
折叠delphi函数
给字符串两边加单引号并返回.

声明:function QuotedStr(const S: string): string;

用函数 QuotedStr把字符串S转换成为用引号括起来的字符串。单引号" ' " 将被插入到字符串s的最前和最后

对应 C#
string QuotedStr(string inp)
{
return "'" + inp + "'";
}

dongsheng10101 2018-12-21
  • 打赏
  • 举报
回复
感谢各位大侠热心回复。

我目前项目都用BCB开发的,但现开发仓库软件,得用PDA设备,所以PDA软件得用C#。

strUser:主要是记录登录的用户名,这个数据在整个软件中经常用到,在不同窗口中,要保存数据时都要把用户存放数据表中,没必要在不同窗口中都来传递当前用户来实现,不如直接定义全局变量。

strAct:用户权限,这个只是测试软件,因数据库结构不同,正式版就不需要了。

连接数据库字符串,目前没帮配置文件,因为我不想明文的把4个参数直接存放到配置文件中,BCB中有做加密的,但项目周期关系,先在软件中写死,等项目提交OK后,后期再做更新。

String.Format:这个确定不错,写法阅读都方便,不易错,得吸收。

BCB中的QuotedStr函数,因C#中没有直接函数,若代码都如下写:
qlCommand.CommandText ="select * from TPADBA where DBA001='" + textBox1.Text.Replace("'", "''") + "'";
看起来不便,且易少写单引号,确实是自己写个得了,反正也很简单,不能有事事找系统函数。
dongsheng10101 2018-12-21
  • 打赏
  • 举报
回复
引用 9 楼 以专业开发人员为伍 的回复:
关于static的问题,我们开发软件一般都是客户端访问自己开发的服务器,而不是桌面客户端去调用 ado.net 访问关系数据库。我们的软件都是基于互联网思维方式来设计的,而不是基于小办公室里的局域网来考虑的。因此数据库操作代码在服务器,而且是高并发的。

假设你的数据库操作代码异常简单,使用 static 变量引用连接对象也未尝不可。总之编程是以测试为准,不是一开始就以书本为准。当你改变自己的位置参加不同项目开发,真理总是有可能被改变的。以测试为准,学会提前设计和编写大规模测试代码,而不是仅仅会编写几行程序代码。


不错的,是值得学习。
到目前我都一都在开发局域网内的软件。软件也没做三层结构,就一个客户端软件。

你说的,是软件要有服务端与客户端一套软件吧
dongsheng10101 2018-12-21
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
折叠delphi函数
给字符串两边加单引号并返回.

声明:function QuotedStr(const S: string): string;

用函数 QuotedStr把字符串S转换成为用引号括起来的字符串。单引号" ' " 将被插入到字符串s的最前和最后

对应 C#
string QuotedStr(string inp)
{
return "'" + inp + "'";
}


public static string QuotedStr(string str)
{
return "'" + str.Replace("'", "''") + "'"; //因这样写
}
loveljy_19901114 2018-12-21
  • 打赏
  • 举报
回复
方法一没什么问题
  • 打赏
  • 举报
回复
引用 楼主 dongsheng10101 的回复:
另外: 在BCB中,SQL语句写法是:String strSql="select * from TPADBA where DBA001=" + QuotedStr(Edit1->Text); 在C#中,SqlCommand.CommandText ="select * from TPADBA where DBA001='" + textBox1.Text.Replace("'", "''") + "'"; 请问,除了这种写法外,还有没有更方便的函数来实现啊?
你为什么不自己写一个 QuotedStr 函数呢?
  • 打赏
  • 举报
回复
如果你编写代码的经历,还没有遇到过在占用一个连接进行数据处理时(例如此时在 while(r.Read()) {....} 循环中),需要再使用另外一个连接来执行查询的情况,或者说甚至也没有见过一个进程的两个线程并发访问数据库会话的情况,那么说明你还需要找机会实际锻炼一下。
dongmusic 2018-12-20
  • 打赏
  • 举报
回复
同意楼上的,拼装sql不是一个好的编程方法,用string.format这种方式比较好。
xuzuning 2018-12-19
  • 打赏
  • 举报
回复
并未看到对 strUser、strAct 的赋值
所以对于
strUser、strAct:在软件登录成功后,把当前用户与权限数据分别存放到这两全局属性中。
的设计,似乎并无价值

一般应用中,不会出现一个实例中有两个及以上用户登录数据库的情况,所以这种多用户设计并没有多少意义
拼装指令串,用 string.Format 比较好,清晰
zhishiheng 2018-12-19
  • 打赏
  • 举报
回复
1、发帖是可以插入代码段的 2、新手一般逻辑不够清晰,但是逻辑能走通 3、
String strSql="select * from TPADBA where DBA001=" + QuotedStr(Edit1->Text);string.Format("select * from TPADBA where DBA001={0}", QuotedStr(Edit1->Text))
4、
Data Source=192.168.1.241 ;Initial Catalog=SunDB;User Id=sa;Password=sa
一般写道配置文件中

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧