赞
踩
该软件仍是WINFORM程序,且仍是原来开发一半却中止的程序,现在接手开发,主要遇到以下问题。
首先,对于接手已经开始的程序开发,最主要的是要先熟悉原来的程序模式,然后判断那些内容需要保留,那些内容可以进行修改保留,以及那些内容完全可以删除。在熟悉了基本的程序思路后,即可开始后续的开发工作了。
在编写程序时,虽然可以进行多线程开发,但由于人的注意力是单线程的,因此,程序需要有一个主线,即在运行时,必须考虑到程序的各种可能性,进而对每一种可能性进行分析处理。
1,EXCEL文件操作时某些DLL未引用问题,此可以通过添加相关文件即可解决。
2,某些窗体遗失问题。即在加载程序时,可能遗漏加载某些窗体,但该窗体已经存在项目中了,此时可能显示无此窗体,但却无法重新创建,即显示已存在。此时将选择添加现有项目即可。
3.配置文件设置问题。config.ini为轻量级的配置文件类型ini,以前delphi等语言就喜欢用ini存放配置信息,但是C#中已经很少使用。现在一般配置文件就是xml(web.config、app.config都是xml文件)。但无论那种配置文件,都需要正确设置相应的读写操作逻辑。另外,需注意配置文件正确的存放位置,因为这涉及到是否能成功读写操作。
4.将计算机名称更改后,显示无法链接数据库。后经查看确认为,本地数据库的服务(即在电脑/管理/服务/MSSQLSERVER)的属性中设置了服务启动的登录名称,因此,如果更改了电脑名称,即相当于更改了服务器名称,从而需要重启数据库服务,但此时需要更改该服务的属性,才能进而启动服务及数据库。
5.在更改数据库的文件存储位置时,需要先备份文件,然后在VSMGR中更改存储位置,然后停止SQL服务,然后删除原来的文件,然后重启服务及VSMGR,最后还原文件到指定位置即可。
6.可以使用对象池的BorrowDBConnection() 方法来从对象池借一个数据库连接, 然后通过调用对象池的ReturnDBConnection() 方法来返还数据库连接。
7.adapter.Fill(ds, "userData") 我们填充数据的时候不能直接填充到dataset里,必须把数据填充到datatable 上面的“userData” 就是要创建的datatable名字 如果使用adapter.fill(ds)方法的话 它会创建默认的table1 ,所以你指定第二个参数就等于给程序指定了你要创建的datatable名字,
不过你可以这样用
不适用dataset 使用datatable
DataTable dt=new DataTable(“userData”);
adapter.fill(dt);
这效果一样~~
8.c#函数参数里直接赋值,可选参数,是指给方法的特定参数指定默认值,在调用方法时可以省略掉这些参数。
9.BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用。使用这些API我们可以将Code与各种具体类型数据源进行解耦;使用这些Event我们可以洞察数据的变化。
10.使用DataRelation 通过DataColumn 对象将两个 DataTable 对象相互关联。例如在“客户/订单”关系中,客户表是关系的父表,订单表是子表。此关系类似于主键/外键关系。有关更多信息,请参见浏览表间关系。
关系是在父表和子表中的匹配的列之间创建的。即,两个列的 DataType 值必须相同。
关系还可以将父级 DataRow 中的各种更改层叠到其子行。若要控制在子行中如何更改值,请将 ForeignKeyConstraint 添加到 DataTable 对象的 ConstraintCollection。ConstraintCollection 确定在删除或更新父表中的值时采取什么操作。
在创建 DataRelation 时,它首先验证是否可以建立关系。在将它添加到 DataRelationCollection 之后,通过禁止会使关系无效的任何更改来维持此关系。在创建 DataRelation 和将其添加到DataRelationCollection 之间的这段时间,可以对父行或子行进行其他更改。如果这样会使关系不再有效,则会生成异常。
DataRelation 对象包含在 DataRelationCollection 中,后者可以通过DataSet 的Relations 属性、DataTable 的 ChildRelations 和 ParentRelations 属性来访问。
private void CreateRelation()
{
// Get the DataColumn objects from two DataTable objects
// in a DataSet. Code to get the DataSet not shown here.
DataColumn parentColumn =
DataSet1.Tables["Customers"].Columns["CustID"];
DataColumn childColumn =
DataSet1.Tables["Orders"].Columns["CustID"];
// Create DataRelation.
DataRelation relCustOrder;
relCustOrder = new DataRelation("CustomersOrders",
parentColumn, childColumn);
// Add the relation to the DataSet.
DataSet1.Relations.Add(relCustOrder);
}
11.语法 SET
注释 当
如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
12.如果你在程序里面写sql,就不要加分号,在程序里面编译器会把分号当做sql本身的一部分,所以会报错
如果是在查询工具里面(比如plsql),这个时候可以加上分号,在工具里面分号是个分隔符,看到分号就标志着本条sql语句结束了;
当然不加也可以,在工具里面看不到分号就认为本条sql没有结束。
比如:你写了两条sql,但是没有用分号隔开,此时,工具会当做一条来执行,只不过会报错而已。
13.存储过程中,使用insert into,需要先手动创建临时表,
1.1 保存从select语句中返回的结果集createtable test_getdate(c1datetime)
insert into test_getdateselectGETDATE()
select *from test_getdate
1.2 保存从存储过程返回的结果集
insertinto #helpuserexec sp_helpuserselect*from #helpuser
1.3 保存从动态语句返回的结果集
insertinto test_dbccexec('DBCC TRACESTATUS')select*from test_dbcc
1.4不能嵌套使用insert exec语句
14.net use 文件路径 /user:账号 密码 /PERSISTENT:YES可以判断是否链接成功。
15.进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
如果只想从特定的URI请求文件,则使用WebClient,它是最简单的.NET类,它只用一两条命令执行基本操作,.NET FRAMEWORK目前支持以http:、https和file:标识符开头的uri。
WebClient类提供了UploadFile()和UploadData()方法,在需要投递HTML窗体或上传整个文件时候,就可以使用这两个方法。
webclient下载文件有两种方法,使用downloadfile()方法,应用程序需要处理从web站点检索的数据,为此要用到OpenRead方法。
16.在使用vs进行开发时,我们有时会使用Image.FromFile配合PictureBox来加载并显示图片,感觉挺方便,但是使用Image.FromFile有个小问题,加载完文件后不自动释放,导致再次操作被关联文件时候出现类似“文件xxx正由另一进程使用,因此该进程无法访问该文件。”的错误,因此当要对一个文件进行多次操作时,最好不要使用Image.FromFile 而使用Image.FromStream。
17.SoundPlayer类是.NET Framework 2.0中新增的类,用于控制.wav文件中的声音播放。
spPass.Play();//播放.wav音频
spPass.Dispose();//释放由Conponent占用的资源
spPass.Equals();//判断两个object实例是否相等
spPass.GetType();//获取当前实例的Type
spPass.PlayLooping();//使用新线程循环播放.wav文件,若尚未加载.wav文件,则先加载该文件
spPass.Stop();//如果播放正在运行,则停止播放
player.SoundLocation = @"sound/Success.wav";
player.Load();
player.Play();
18.SQL中的cast 和convert都是用来将一种数据类型的表达式转换为另一种数据类型的表达式。CAST 和 CONVERT 提供相似的功能,只是语法不同。在时间转化中一般用到convert,因为它比cast多加了一个style,可以转化成不同时间的格式。
CAST ( expression AS data_type ), CONVERT (data_type[(length)], expression [, style]).
19.SQL中Like关键字用来模糊比较字符串,百分号%匹配0个或多个字符,下划线'_'匹配一个字符。还可以用方括号只匹配指定的某几个字符,例如[a-z],匹配小写字面。方括号中加入^表示匹配除指定字符以外的字符。
20.SQL right()函数返回最右边的len个字符的字符串str,或返回NULL如果任何参数是NULL。
21.Marshal提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。
命名空间:System.Runtime.InteropServices
程序集:mscorlib(在 mscorlib.dll 中)
22.0xFFLU中,U 是 unsigned的简写,代表前面的FF是无符号数,L 是 long的简写,代表前面的FF是无符号长整形数。
23.如果存在三级继承,在基类中存在一个字段,如果第二级未赋值,而第三级赋值了,则可以直接在第二级中调用,前提是第三级赋值时未进行NEW覆盖,而是OVERIDE重写,或直接赋值。
24.在使用SQL SERVER本地数据库时,连接字符串一般用相对路径即可,虽有时数据库的地址在SQL SERVER的保存目录下,在程序运行时在程序本身BIN目录下有数据库映射体,但一般不影响数据库的使用,不过有些程序本身设置了的静态变量保存数据(如WINFORM),此时如果程序中没有相应的更新机制,则往往需要重启程序才能改变此静态变量,即保证此静态变量与数据库中一致。
25.设置本地的共享文件时,除注意共享的相关属性外,还应注意共享的一般引用模式为:主机IP地址+共享文件夹,如\\192.168.0.101\001,其中001为文件夹名称,且最后让该文件夹位于某个磁盘的根目录下,以避免与应用程序共享文件夹时出现锁死导致无权访问的情况。访问共享文件夹时需要本机的登录名称及密码。此时注意WIN10中的用户名与一般显示的账户名不同。此时还应注意网络地址\与一般物理地址/的区别。设置共享时,一定要注意赋予了那个用户共享,即用哪个账户登录时可以共享。否则容易登录或路径查找失败。
而访问共享文件的一般命令为:\\IP\001 /USER 用户名 密码/persistent:yes.
26.点开开始菜单,在搜索框中输入“cmd”,在搜索结果中,对着命令提示符程序,单击鼠标右键,菜单中点击选择“以管理员身份运行”。此时可以拥有较高的权限。
27.c#winform选择文件方法 OpenFileDialog fileDialog =new OpenFileDialog();fileDialog.Multiselect=true;fileDialog.Title="请选择文件";fileDialog.Filter="所有文件(*.*)|*.*";if (fileDialog.ShowDialog() == DialogResult.OK){string file=fileDialog.FileName;
c#winform选择文件夹方法 FolderBrowserDialog dialog =new FolderBrowserDialog();dialog.Description="请选择文件路径";if (dialog.ShowDialog() == DialogResult.OK){string foldPath = dialog.SelectedPath;
c#winform打开指定目录方法 System.Diagnostics.Process.Start("Explorer.exe","c:\\windows");
28.C# winform 遍历文件夹 List<
string
> fileNames =
new
List<
string
>();
foreach
(
string
childPath
in
Directory.GetDirectories(path))
{
fileNames.AddRange(GetAllFile(childPath));
}
DirectoryInfo dir =
new
DirectoryInfo(path);
foreach
(FileInfo file
in
dir.GetFiles())
{
fileNames.Add(file.Name);
}
29.c#如何判断一个字符串变量是否在一个字符串数组 arr.Contains(str).
30. C# 获取文件名及扩展名
string aFirstName = aFile.Substring(aFile.LastIndexOf("\\") + 1, (aFile.LastIndexOf(".") - aFile.LastIndexOf("\\") - 1)); //文件名
string aLastName = aFile.Substring(aFile.LastIndexOf(".") + 1, (aFile.Length - aFile.LastIndexOf(".") - 1)); //扩展名
31.SQL 2008数据库,遇到一些问题。“您对无法重新创建的表进行了更改或者启用了“阻止保存要求重新创建表的更改”选项”。开SQL 2008 在最上面工具-〉选项-〉左侧的 Designer-〉表设计器和数据库设计器 ->阻止保存要求重新创建表的更改(右侧)把钩去重新启动2008即可。
32.使用Group By子句的时候,一定要记住下面的一些规则:
(1)不能Group By非标量基元类型的列,如不能Group By text,image或bit类型的列
(2)Select指定的每一列都应该出现在Group By子句中,除非对这一列使用了聚合函数;
(3)不能Group By在表中不存在的列;
(4)进行分组前可以使用Where子句消除不满足条件的行;
(5)使用Group By子句返回的组没有特定的顺序,可以使用Order By子句指定次序。
34.当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行。
解决方法:
1、直接在dataset中增加的,dataset中增加,datagridview自然就增加了.
2、在数据绑定之前插入一个空行DataTable.Rows.insertat(DataTable.NewRow,位置),然后再绑定。
3、直接DataTable.Rows.Add(DataTable.NewRow)就是在最后一行加入一个空白行
string[] strArray ={ textBox1.Text, textBox2.Text };
((DataTable)dataGridView1.DataSource).Rows.Add(strArray);
4、添加一个 BindingSource所有的问题都解决了。首先是把数据源设给 BindingSource 的数据源。然后再把BindingSource设给 DataGridview 的数据源。需要使用BindingSource中转一下才可以。
5、调用datatable的insert方法插入到指定位置
38.C#多个sql语句结果放在同一个dataGridView中, 联合查询。
string
sql =
""
;
for
(
int
h = 0;h < n;h ++) {
if
(h == 0)
sql +=
"select * from t_teacher_card where kh = '"
+ aa[h] +
"' "
;
else
sql +=
" union all select * from t_teacher_card where kh = '"
+ aa[h] +
"' "
;
}
/*以下是你的查询结果和显示在dataGridView中的代码*/
39.c# 如何将字符串中用","分开的数字分别存入数组中 string[] str="1,2,3,11,12,13".Split(',');
40.判断datagridview中是否有某行被选中,语句为dgv1.SelectedRows.Count==0,此时注意DataGridView的SelectionMode属性为FullRowSelect。
41.一般扫描枪中内置ENTER事件,但此事件一般需要在各个键的事件中触发,因为事件中需要相应的参数。
42.sql server 备份失败[上加载的介质已格式化为支持 1 个介质簇,但根据指定的备份设备,应支持 2 个介质簇]
这句话的意思是,我的C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\路径下已经存在一个备份文件,不能有多个,所以解决方法就是直接覆盖原先的备份文件就好了。
只能有一个备份文件。
43.
LEFT JOIN :以左表为基础,显示左表中的所有列,不管是否与关联条件相匹配,而右表中的数据只显示与关联条件相匹配的列,不匹配的列以NULL字符填充.
RIGHT JOIN:以右表为基础,显示右表中的所有列,不管是否与关联条件相匹配,而左表中的数据只显示与关联条件相匹配的列,不匹配的列以NULL字符填充.
FULL JOIN :显示多个表中的所有的列,不匹配关联条件的列以NULL字符填充.
45.滚动鼠标的滚轮,触发的是窗体或控件上的 MouseWheel 事件。
首先在窗体构造方法,里加入这样一句话
最后通过e.Delta来引用鼠标滑动的大小。
对于如何将控件居中,则将控件的位置相应的加减一半即可。
46.CHARINDEX和PATINDEX函数常常用来在一段字符中搜索字符或者字符串。如果被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数。PATINDEX函数支持使用通配符来进行搜索,然而CHARINDEX不支持通佩符。
CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。CHARINDEX函数调用方法如下:
CHARINDEX ( expression1 , expression2 [ , start_location ] )
Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。
CHARINDEX函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置。假如CHARINDEX没有找到要找的字符串,那么函数整数“0”。
47.能否对DataTable执行SQL语句,一般可以通过DT.SELECT()或者LINQ进行操作。
48. 今天在操作一个PICTUREBOX的缩放操作时较费劲,主要时更改DOCK属性时,其尺寸变化较大,后经确认,主要时没有提前确认好其尺寸。即在更改DOCK为FILL时,更改的尺寸是无效的。故如果需要更改其尺寸,需要先更改DOCK属性。
49.在操作鼠标拖放控件时,基本使用MouseDown、MouseUp、MouseMove三个事件。而且使用this.refresh()事件可以立即刷新,但注意放在那个事件中。
如果设置了整个窗体的DoubleBuffered属性为TRUE,即对控件进行双缓冲处理。则可以在一定程度上缓解控件闪烁问题。
另外,在MOUSEMOVE中设置控件的移动,而不是在MOUSEDOWN中设置控件的移动可以更好的改变控件的闪烁问题。
即在MOUSEDOWN事件中仅标记鼠标的坐标,而在MOUSEMOVE中标记控件的改变,这样在鼠标按下时就不会出现闪动现象了。
50.联合查询时如何对一个表进行分组。即SELECT的结果就是一个表。同时若跟条件子句,则条件中的字段一般用左连接的右表。
select a.品名,a.规格,a.数量,b.数量,c.数量
from
(select 品名,规格,sum(数量)数量 from A group by 品名,规格)A inner join (select 品名,规格,sum(数量)数量 from B group by 品名,规格)B on a.品名=b.品名
inner join (select 品名,规格,sum(数量)数量 from C group by 品名,规格)C on a.品名=c.品名
51.
DataTable 修改列名 删除列 调整列顺序
string
[] files = Directory.GetFiles(
"你所指的的文件"
);
//文件的数量
int
fileNum = files.Lenght;
53.设置鼠标的形状。
即在鼠标的事件中设置Cursor属性即可。如Cursor = Cursors.Hand; 如何设置this.Cursor则会改变鼠标所在控件的形状。
58.e.KeyCode==Keys.Enter判断输入enter键。
60.今天才发现,对于数据库操作,最方便的是在数据库中,而C#等语言的程序中对其操作,则是间接方法。因此,SQL语句还是比较重要的。
61.对于DATETIME格式的字段,如果单纯用来存储数据,还不如字符串来得方便,但若涉及到时间变更,则DATETIME有天然的优势,如DATETIME格式的变量M,则其前一天是M-1.
62.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。