.NET下的SQL操作

   这段时间研究了WCF和C#的ADO.NET, SQL操作,LINQ查询虽然方便,但是对于刚开始学习,特别是没有好的指导老师的人来说,还是不推荐大范围使用。所以这里还是使用常规的数据库操作方法。

  1. 连接数据库,其实作用并不大,好处在于自动生成ConnectString。

image

右键点击 Data Connections,选择Add Connection, 开始添加数据库,注意\SQLEXPRESS,另外如果要远程链接,现在数据库中注册有权限的帐号,然后登陆。

2. 连接ADO.NET,作用在于会自动生成对于的数据结构类,方便我们的操作,也就不用每个表都要创建类了。

  右键点击Project, 添加Data页的ADO.NET,同样也是配置数据库的连接。

image

3. 在我们第一次连接的数据库Server属性中有一个Connection String, Copy之。

        public int SQL_connect()
        {
            SQLConnect = new SqlConnection();

            SQLConnect.ConnectionString = "Data Source=WIN-01L9BROHARG\\SQLEXPRESS;Initial Catalog=TutorNet;Persist Security Info=True;User ID=ctq;Password=ctqmumu";

            SQLConnect.Open();

            if (SQLConnect.State != System.Data.ConnectionState.Open)
            {
                //TODO output error
                return ErrorReturn;
            }

            return 0;
        }

有返回值的数据库操作

 
 public List SQL_select_user_By_ID(string UID)
        {
            if (SQLConnect == null) SQL_connect();

            List listUser = new List();

            try
            {
                SQLCommand = new SqlCommand();

                SQLCommand.Connection = SQLConnect;

                SQLCommand.CommandText = "SELECT * FROM UserTable WHERE UID = '" + UID + "';";

                SQLCommand.CommandType = CommandType.Text;

                SqlDataReader reader = SQLCommand.ExecuteReader();

                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        listUser.Add(new UserTable
                        {
                            UID = (int)reader[0],
                            Password = (string)reader[1],
                            Name = (string)reader[2],
                            PhoneNumber = (reader[3] is System.DBNull) ? null : (string)reader[3],
                            Email = (string)reader[4],
                            ST = (reader[5] is System.DBNull) ? 0 : (int)reader[5],
                            Point = (reader[6] is System.DBNull) ? 0 : (int)reader[6],
                            PopIndex = (reader[7] is System.DBNull) ? 0 : (int)reader[7],
                            Login = (int)reader[8]
                        });
                    }
                }
                else
                {
                    //MessageBox.Show("No rows found.");
                }
                reader.Close();

            }
            catch (Exception e)
            {

                return null; // 因为在WCF部署后无法正确处理,所以return null
            }

            return listUser;
        }

无返回类型的操作,返回为bool型,即插入,更新和删除操作

    public bool SQL_UPDATE_UserTable_Login(string UID, int val)
        {
            Int32 recordsAffected = 0;
            try
            {

                string queryString = "UPDATE UserTable SET Login=" + val + " WHERE UID=" + UID + " ;";

                SqlCommand command = new SqlCommand(queryString, SQLConnect);
                recordsAffected = command.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                return false;
            }

            return true;
        }
发表在 C#, 编程 | 标签为 , , | 留下评论

[无题]有时候静静的听歌也好

发表在 唠叨 | 标签为 , | 留下评论

如何增加WCF连接的最大传输长度

刚刚在调试WCF传输Byte[]格式图片时,遇到了WCF默认限制传输不能超过16K的问题。

最开始显示的提示是:

   Bad request , Code:  400

想了一会,觉得是IIS7的配置问题,于是查看了一下默认配置,打开IIS的“失败请求跟踪规则”

image

配置跟踪400错误,之后再运行,显示错误:

“The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation ‘XXX’. The maximum array length quota (16384) has been exceeded while reading XML data. This quota may be increased by changing the MaxArrayLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 1, position 39987.”

现在看到错误了,可以去Google一下,查看到具体信息,需要调整:

这篇文章写的很详细:How to Increase the MaxArrayLength in a WCF Component

注意的情况有:1. 分别更新客服端和服务端的.config文件 2. 推荐使用工具里的“WCF服务配置编辑器”

最后成功的情况:

image

发表在 C#, 编程 | 标签为 , , | 留下评论

4月15日

昨晚过错了帮小葛的签到,愧疚。

因此晚上和他们聊了一会,体会到很多,这也是我要自己作出抉择的地方吧。

感性和理性,如果一直这样交错占据主动,以后会出大问题的。

需要跟多时间好好想想,不要伤害了身边的人。

发表在 唠叨 | 标签为 | 留下评论

[转载]How To Read C Declarations

查看C++书的时候,碰巧看到一个函数声明

bool Sales_item::same_isbn   (const Sales_item * const this, const Sales_item &rhs) const

意思是:当一个函数被声明为常量成员函数(const member function),

这时隐藏的this指针被标记成  const Sales_item * const this, 是的,这里有两个const。

下面的这篇文章教导人们如何快速的阅读 C Declarations。

给出三个实例。 断言为 *a = b 是合法的。

  const int * a = &b;  // 假

  int const * a = &b; // 假

  int * const  a = &b; // 真

  ZZ from http://blogold.chinaunix.net/u1/36290/showart_443799.html

    Even experienced C programmers have difficulty reading declarations that go beyond simple arrays and pointers. For example, is the following an array of pointers or a pointer to an array?

int *a[10];

What the heck does the following mean?

int (*(*vtable)[])();

Naturally, it’s a pointer to an array of pointers to functions returning integers. 😉

This short article tells you how to read any C declaration correctly using a very simple technique. I am 99% certain that I read this in a book in the late 1980s, but I can’t remember where. I doubt that I discovered this on my own (even though I’ve always been delighted by computer language structure and esoterica). I do remember, however, building a simple program that would translate any declaration into English.

The golden rule

The rule goes like this:

"Start at the variable name (or innermost construct if no identifier is present. Look right without jumping over a right parenthesis; say what you see. Look left again without jumping over a parenthesis; say what you see. Jump out a level of parentheses if any. Look right; say what you see. Look left; say what you see. Continue in this manner until you say the variable type or return type."

这条规律是这样的:

     从变量名(或者是一个最深处的结构)开始,先看他右边一个命名,不要越过右括号(即遇到括号放弃),说出你看到的,然后再看他的左边一个命名,同样不越过当前层左括号,说出你看到的,一次循环后,如果这次遇到了阻挡,那么跳出这对括号;依次反复,直到读完所有的变量。

   我或许可以模糊的告诉你大意,但是我认为更好的办法就是阅读原文(直接看英语更利于你理解)。起码该自己阅读下面的话:

The degenerate case is:

int i;

Starting at i, you look right and find nothing. You look left and find the type int, which you say. Done.

Ok, now a more complicated one:

int *a[3];

Start at a. Look right, say array of size 3. Look left and say pointer. Look right and see nothing. Look left and say int. All together you say a is an array of size 3 pointers to int.

Adding parentheses is when it gets weird:

int (*a)[3];

The parentheses change the order just like in an expression. When you look right after a, you see the right parenthesis, which you cannot jump over until you look left. Hence, you would say a is a pointer to an array of 3 ints.

Function pointers

The C "forward" declaration:

extern int foo();

just says that foo is a function returning int. This follows the same pattern for reading declarators as you saw in previous section. Start at foo and look right. You see () so say function. You look left and see int. Say int.

Now, try this one:

extern int *foo();

Yep, you say foo is a function returning a pointer to int.

Now for the big leap. Just like we can make a pointer to an int or whatever, let’s make a pointer to a function. In this case, we can drop the extern as it’s no longer a function forward reference, but a data variable declaration. Here is the basic pattern for function pointer:

int (*foo)();

You start at foo and see nothing to the right. So, to the left, you say pointer. Then to the right outside you see function. Then left you see int. So you say foo is a pointer to a function returning int.

Combinations

Here is an array of pointers to functions returning int, which we’ll need for vtables below:

int (*Object_vtable[])();

You need one last, incredibly bizarre declaration, for the lab:

int (*(*vtable)[])();

This is the pointer to the vtable you will need in each "object" you define.

This pointer to a vtable is set to the address of a vtable; for example, &Truck_vtable.

Summary

The following examples summarize the cases needed for building virtual tables ala C++ to implement polymorphism (like the original cfront C++ to C translator).

int *ptr_to_int;
int *func_returning_ptr_to_int();
int (*ptr_to_func_returning_int)();
int (*array_of_ptr_to_func_returning_int[])();
int (*(*ptr_to_an_array_of_ptr_to_func_returning_int)[])();
 
 
发表在 C, C++, 编程, 网摘, 网络, 读书 | 标签为 , | 留下评论

【整理】接口,抽象类,继承和多态

首先是基本信息,面向对象编程有三个特征,即封装、继承和多态。

封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。

继承是为了重用父类代码,同时为实现多态性作准备。

那么什么是多态呢?多态的使用是为了使得程序开发时,控制代码的耦合性,使得开发,维护,修改的代价保持在较低水平。

当当这样说肯定是不足以说明的,先来看下面的例子。

Java和C++中的描述略有不同,因为C++允许多继承,而Java是单继承。

这里先给出Java多态的测试:


public class Father {
	
	public int test = 1;
	
	public void print() {
		
		System.out.println("Father have:" + test);
		
	}	
	
	public static void main(String[] args){
		
		Father son = new Son();
		
		son.print();
		
		System.out.println("Now have:"+son.test);
		
		Son _son = (Son)son;
		
		System.out.println("Now have:"+_son.test);
			
	}

}
public class Son extends Father {
	
	public int test = 2;
	
	public void print(){
		
		System.out.println("Son have:" + test);
		
	}	
}

/** 输出 **/

Son have:2
Now have:1
Now have:2

了解了基本的多态方法后,就会遇到一个问题,什么时候该使用多态?

这篇文章介绍了如何避免被你的项目经理”消灭”的方法

例如我们有一位用户的测速需求,他现在使用的是JD,而过了一段时间改用Benz,如果高耦合的开发很可能要重新添加修改大量代码。所以引进了多态。这时可以回过头看上面的话:

多态的使用是为了使得程序开发时,控制代码的耦合性,使得开发,维护,修改的代价保持在较低水平。

回头找来C++的书,写一写C++的多态代码

发表在 C++, JAVA, 编程 | 标签为 | 留下评论

2011年4月7日

  这些天事情很多,事情不太如意。昨天和身边的人的约定也没能做到。

  究竟是为什么,要做的事情很多,我并不在意,但是总是交杂着纷纷绕绕的琐事,心一直想着很多事情,是因为假期的时候休息的太久,一下子忘记怎么做事了么。

  想认真的把事情做好,却老是静不下心来,尤其是这两天开始接触C#, SQL Server, LINQ, 很多细节用的虽然方便,但是完全不能一览全局,四处找文档,也没有发现,到了后面甚至连现在操作的类是什么都不清楚了,这种迷失在封装,接口,实现中的感觉一点都不好。

  想起以前的一句话,用一个东西,不明白它的道理,实在让人很郁闷。

  写了一个简单的Socket的多线程聊天室软件,Win32下面的线程比较难写,不过用C#实现的话又方便很多,只是互相通信需要一个特殊的集合。

  写了一个简单的监听程序,但是过滤有点问题,抓到的数据包奇奇怪怪的。

  一直在听《风雨无阻》,好好做事,积累人品。

发表在 唠叨 | 标签为 | 留下评论

【转】这七句话被中国人误传了数千年

这一篇是写给那些迷茫孩子的,如果你理解错了这句话,你会陷入自己的监狱,不能自拔。如果你知道这句话的真正意思,我恭喜你,孩子,这时你才真正长大。

 

发信人: fqyspring (思考者), 信区: WHU
标  题: 【转】这七句话被中国人误传了数千年
发信站: 珞珈山水 (Sun Apr  3 11:31:17 2011), 站内
这七句话被中国人误传了数千年
在中国崇尚权威的文化氛围中,名人名言占的地位是很重的,很多名家说的话,往往被人民当成指导自己人生观世界观的不二准则,但这些几千年流传下来的名言中,也有一些话被人刻意或无知地曲解,背离了话语者本身的意旨与初衷,迷惑了天下万千受众。影不才,试举数例解析一二,以还世情真相与大众……好了我再文诌诌地说话大家估计要扔鸡蛋,虚荣心也满足了,下面开始举例开讲。
1、以德抱怨
原句:“或曰:‘以德报怨,何如?’子曰:“以德报怨,何以报德?以直报怨,以德报德”————《论语宪问》
以德抱怨,是我们常听到的一句话了,人们通常理解的“以德抱怨”什么意思呢?就是说:孔老夫子教我们,别人欺负你了,你要忍,被打碎牙齿也要往肚子里吞,别人来欺负你,你反而应该对他更好,要用你的爱心去感化他,用你的胸怀去感动他。这就让人感觉很有点肃然了。想想看,如果我一巴掌呼过去那个被打的人还笑笑说打得好啊,你越打我我就要对你越好……遇到这种情况我也会感动到傻眼,这多好一孩子,多伟大的情操啊……
但事实上,我们根本曲解了孔子的原意,我当初,也万万没想到原来在孔子这句“以德抱怨”的后边还跟着另外一段话,什么话呢?子曰:“以德抱怨,何以报德?以直报怨,以德报德!”看完以后,幡然醒悟,原来我们都被某个断章取义的孔子FANS给玩了一把!当时的真实情况是怎么样的呢?孔子的一个弟子问他说:师傅,别人打我了,我不打他,我反而要对他好,用我的道德和教养羞死他,让他悔悟,好不好?孔子就说了,你以德抱怨,那“何以报德?”别人以德来待你的时候,你才需要以德来回报别人。可是现在别人打了你,你就应该“以直抱怨”,拿起板砖飞他!看!就因为被人故意省略了一句话,刚烈如火的孔老夫子一下就被扭曲成了现在这个温婉的受气包形象。
与西方文化相比,东方文明一向被认为是谦逊坚忍的,同样是被人欺负,西方的带头大哥耶稣在圣经里就叫嚣要:“以眼还眼,以牙还牙。”小弟们!别人瞪了你一眼,你就要瞪回去,别人咬了你一口,你就要咬回来!而东方呢?佛家的精神领袖释迦牟尼说“我不入地狱,谁入地狱?”一副逆来顺受的样子。而且他可不是说说而已的,大鹰来欺负他,要吃他的肉,他也真从自己身上一刀刀帮大鹰割下肉来,这就伟大得有点近乎BT了。说完了国外的几位大领导,再回到中国,孔老宗师的这句话为什么会被别人有意地曲解呢?根源还是当时封建统治者的需要,他们的心思,无外乎就是要信仰孔子的万千民众成为“以德抱怨”的顺民,只有“以德抱怨”的民众,才会老老实实地服从他们的剥削和压迫。我们再来看看影响吧,孔老先生这句被曲解了的“以德抱怨”,在中国文化史上起的压迫作用,可真是大到了天上。皇帝残暴,我们要“以德抱怨”,地主剥削,我们要“以德抱怨”,八国联军都打到北京了,还是要“以德抱怨”,要卑躬屈膝,要割地称臣,要想尽一切办法彰现自己的“德”,要“量中华之物力,结大国之欢心”……就是没想过反抗。试想,如果中国的文化里,没有这种把正确的思想东篡西改来为封建统治阶级服务的恶习,如果孔子这句原话没有被刻意地曲解成这样子,我们中国人会养成这样一种懦弱的思维惯性吗?有人说西方人的骨子里本性是狼性,而东方人的骨子里的本性是羊性,这里如月影倒想问问了,是什么原因让我们变成了这样?如果我们从古以来信奉的是西方那种“以眼还眼,以牙还牙”的训诫,近代史上的中国,会给世界留下那么一个任人鱼肉的印象吗?
以德抱怨。
原句:以德抱怨,何以报德?以直报怨,以德报德。
歪曲程度:8
反面影响:9

 

继续阅读

发表在 网摘, 网络 | 标签为 , , | 留下评论

悲剧是怎么炼成的

晚上写了一个简单的Sniffer,  发现报错 ( 无效的参数 )。

怀疑是平台不兼容的问题,四处找答案,从读源码到Google,  从晚上折腾到早上,最后发现是:

if ( sock = Socket() < 0 )

原先还在纳闷socket怎么会返回0, 看了书上 socket()错误会返回-1 就没怎么在意了。

早上仔细一看原来自己真的2了,经常在Blog里面说的,比较的优先级大于赋值,最后还是忘记了,哎。

杯具啊。

既然来说了,顺便贴一下代码吧。

继续阅读

发表在 C, Linux, 唠叨, 编程 | 标签为 , | 留下评论

Unix 网络编程 小结(1)

前天放话出来,昨天更新一下CS:APP第五章,虽然一直惦记着,但是还是没能看完,这里先整理一下《Unix网络编程》的心得吧,目前看到第三章,重新整理一二章。

关于《Unix 网络编程》(简称UNP): 提起Unix编程,当然要《Advanced Programming in the UNIX Environment》(APUE), 被誉为UNIX编程“圣经”。然而Unix网络编程一点也不逊色,反而我更喜欢看这本书,APUE虽然也在看,但是内容繁多而且需要大量实践,看了一章往往要消化很久,但是现在已经基本完成了网络的学习,继续深入学习Unix网络编程是很好的。

1. 关于异步回调(Asynchronous callback), 经典的Unix网络编程一般使用"客户端请求,服务器端响应"的交互模式,但是特殊情况会需要异步回调的使用(PS: Windows Phone 7 里消去了网络同步交互,几乎都使用异步回调来替代原始的请求响应模型),在后面的文章里会详细介绍。

2.  Web –> Tcp –> IP 这是前面看书时候写下来的,想体现的是协议的链接调用情况。

3. 主机 –> LAN(区域网) –>WAN(广域网) 体现的是物理的链接情况。PS: 最大的广域网是Internet。

4. 比较优先级高于赋值。

5. TCP endpoint,TCP接口又被称为TCP终结点,之所以写下来是因为WCF里面也有相似的概念,看来命名上是炒冷饭了。

6. 应用程序 –> C库函数 –>系统调用

   关于系统调用,和库函数的关系,APUE第一章(侥幸看完了)里有详细的解释,系统调用多而繁杂,用于最基础的实现,而库函数封装了系统调用,整理和划分了同类的实现。

但是在层次看来,系统调用在内核层,而库函数在应用层和内核层两者直接(当然书上是分在应用层里),也不排除内核层的函数直接暴露在应用层让程序调用,三者的关系在书上的连接是用双向的。

7. SYN, FIN, RST, ACK, PSH, URG, 最后一个是紧急情况的序号传递,以上是TCP连接控制消息。

8. PDU ( Protocol Data Unit) 在UNP里,译者花了一大版来描述在不同协议层下的PDU。而

PDU: 计算机网络对等实体间交换的单位信息称为协议数据单元(PDU)。

image

 

10 . Thread 线程调用出错返回Error值。

11. \r\n \r = 0x0D \n = 0x0A

12. call 指令把当前eip压栈并跳转,如果从多线程考虑,他应该是原子指令,可以确定的是他只有一条机器码。

发表在 Linux, 系统, 网络 | 标签为 , , | 留下评论