C#初学者小小心得

如果你偶尔看到这篇文章,如果你不是初学者,是对编程有一定经验的程序员,那么这篇文章对你的意义是不大的。本文的主要对象,是不是程序员出身,在IT工作中偶尔,或者使用编程轻量语言编程的,例如VBA,刚开始学习C#, 那么这篇文章可能会对你有所帮助。

背景

我的职业生涯一直都是偏软件使用,没有大型系统的编程经验,在长期工作中,我主要使用的是Perl,VBA这样的轻量级语言,也就是我没有系统的学习编程,也没有编程思想。

可是,在工作中还是经常会用到编程,而且VBA也不足以应付所有场景。我刚开始要用的是Javascript,我就开始学习Javascript,可是学习到一半,我发现需要了解Web Dom,然后HTML,CSS,最后又发贱到去学VUE。

转了一圈回来,发现很累,我这种救火式学习方式,知识非常碎片化,很不系统,于是我就决定系统学习一门语言。

在Java和C#之间,根据知乎的介绍,我选择了Java,但是学习过程中,发现C#的例子很多,就又跑回来学习C#,其实是Java学不下去了。

我的废话好多啊,按照知乎的介绍,我就开始阅读C#入门资料,不出所料,看的我每天昏昏欲睡,头痛欲裂,这样持续了两个月,我说不行啊,按照这种方式,我肯定最后学学就放弃了。不要笑话,我学Javascript就是这样,你说会吗,会,你用可以用吗,非常费力,我想这是初学者学习编程的通病了。

按照大家推荐方法,这时候改开始动手练习了,一练习,各种阻碍啊,所以我才写这篇文章。

其实上面这么多废话,其核心都是一个学习方法问题,大叔我40+了,在35之后,一直在思考一个问题,什么是有效的学习方法。按照通常的学习方法,其效率是非常低下,这点可以参考在Ted talk里有个老外介绍外语学习方法。

这个话题太大,就此打住。但是大家感触都一样,如果你是外行,不是本职工作,学习新知识,就是学起来很累,很难坚持,往往坚持不了多久就会放弃。

网上传统C#的学习方法,我是学不下去的。我本人是个算爱好学习的人,40+还在学习新知识,但是网上的方式,我敢说,我坚持不下去,我身边的人,就没见过坚持下来的,当然,我身边不是顶级人才。我在银行,三流人才吧。

我有个周末思考了下,为什么学不下去:

  1. 太多新知识
  2. 负反馈,没有多少正反馈
  3. 没有老师可以指点 ,完全自己摸索;

可是发现了问题,但是没有人能帮我解决啊,我只能解决负反馈,加大正反馈,这样好让我有兴趣学下去。

于是,我决定,放弃网上方法,不需要读完入门教程,例如delegate看得我昏昏欲睡,先做一些简单东西,可以看到效果的。

我决定先做最简单的ADO NET, 因为从数据库读取数据,是编程最普遍的应用,而且我写VBA也熟悉ADO NET。然后我发现一天就给了我极多的正反馈,极大的加长了我的信心。

上面谈及了我的学习方法,大家可以按照自己的特点,采用适合自己的方式。

学习例子

上面说了半天,我这人很啰嗦的,其实方法很简单,就是只做小东西,把难度降低,同时针对初学者对很多知识点不熟悉,我会尽量给与详细说明

  1. 简单应用
    首先,不要管那些复杂应用,就创建个简单的Form,我的第一个练手案例是ExcelDNA,写Excel Addin;第二个是Chrome web browser,这两个练手后,可想我死的多惨,拷贝来的代码可以运行,但是我看不懂,也改不了。

所以要简单,就是一个Form,至少Form启动后看到一个窗口,说明程序是可以运行的,简单明确有效,帮助你逐步精通。

你不需要管其他的,例如Nudget,妈的我的第一个ExcelDNA就遇到稀奇古怪的问题,废了我好多力气,所以我才说,别管其他,先从简单开始

  1. 用Access练手ADO NET
    为什么要用Access,因为什么都不需要安装,默认的驱动也有,不像你安装个SQL SERVER,还要搞一堆东西,有人说简单啊,是简单。不出事简单,出了事就麻烦,我同事安装Oracle各种错误,我才知道,原来对于他们这些编程出身的,数据库也是各种不懂。

好了,下一步就是用什么驱动,简单,只用OLEDB,这点我被坑苦了,我一开始练习Dataviewgrid,VS自动调用SQLClient,网上例子大部分都是OLEDB,于是我就各种语法不懂,因为新手吗,连引用都不懂,所以都不知道哪里出错了,而且网上例子,我就呵呵,给全的太少了。

代码
下面简简单单一段,就链接数据库,能看到结果,不至于写一大段啥也看不到

private void ConnectAccess()
        {
            // 一定要引用这个,而不是SQLClient using System.Data.OleDb;    //OleDB for Access
            //下面是定义数据库链接字符串,记住拷贝就可以了
            string connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\MyList2.mdb";
            OleDbConnection con = new OleDbConnection(connstr);
            con.Open();

            //然后开个SQL Command,一定要先定义先,这样写代码时会自动补全
            string query = "select * from list";
            OleDbCommand selectcmd = new OleDbCommand(query, con);
            try
            {
                //执行SQL,返回结果
                OleDbDataReader reader;
                reader = selectcmd.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine("========List Records===================");
                    //取第二个,第三个字段,字段从0开始
                    Console.WriteLine(reader.GetString(1) + reader.GetString(2));
                }
                ;
                reader.Close();
            }
            catch (OleDbException ex)  //sample of catching oledb errors
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    Console.WriteLine("Index #" + i + "\n" +
                        "Message: " + ex.Errors[i].Message + "\n" +
                        "Native: " + ex.Errors[i].NativeError.ToString() + "\n" +
                        "Source: " + ex.Errors[i].Source + "\n" +
                        "SQL: " + ex.Errors[i].SQLState + "\n");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            con.Close();
        }

先把上面执行成功,然后就可以添加更复杂的了

  1. 调用Reader读取表结构,字段类型
  2. Update语句的调用,其实就是写回数据库了
private void ConnectAccess()
        {
            string connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\MyList2.mdb";
            OleDbConnection con = new OleDbConnection(connstr);
            con.Open();

            //use con.state to check whether it is opened, but in C#, we should use exceptions
            Console.WriteLine("Access Connected");
            Console.WriteLine("Connection Server version is:" + con.ServerVersion.ToString());

            //SQL Command Samples
            string query = "select * from list";
            OleDbCommand selectcmd = new OleDbCommand(query, con);
            try
            {
                //get Column Name
                OleDbDataReader reader;
                reader = selectcmd.ExecuteReader(CommandBehavior.SchemaOnly);
                var table = reader.GetSchemaTable();  //reader GetSchemaTable function
                var colName = table.Columns["COLUMNNAME"];

                Console.WriteLine("========Table Columns===================");
                foreach (DataRow row in table.Rows)
                {
                    Console.WriteLine("Column name: " + row["ColumnName"] + " Type: " + row["DataType"] + " size: " + row["ColumnSize"]);
                }
                reader.Close();  //must close before next use

                reader = selectcmd.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine("========List Records===================");
                    Console.WriteLine(reader.GetName(1)); //another way to get field name, also GetType can get type
                    Console.WriteLine(reader.GetString(1) + reader.GetString(2));
                }
                ;
                reader.Close();
            }
            catch (OleDbException ex)  //sample of catching oledb errors
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    Console.WriteLine("Index #" + i + "\n" +
                        "Message: " + ex.Errors[i].Message + "\n" +
                        "Native: " + ex.Errors[i].NativeError.ToString() + "\n" +
                        "Source: " + ex.Errors[i].Source + "\n" +
                        "SQL: " + ex.Errors[i].SQLState + "\n");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            //This is a example of OLEDBParameter
            //string query = "update list set  [item]=?, [desc] =?, [link]=?  where ID=?";
            //OleDbCommand updatecmd = new OleDbCommand();
            //updatecmd.Connection = con;
            //updatecmd.CommandText = query;
            //updatecmd.Parameters.AddWithValue("item", item);
            //updatecmd.Parameters.AddWithValue("desc", itemdesc);
            //updatecmd.Parameters.AddWithValue("link", photo);
            //updatecmd.Parameters.AddWithValue("ID", keyvalue);
            //Int32 recordsAffected = updatecmd.ExecuteNonQuery(); 
            //only update delete insert will return affected record, the rest return -1
            con.Close();
        }

大家一定要循序渐进,这样难度就降低了

Access成功了,马上试验SQL Server, 看看,除了connection string不一样,其他都差不多

private void ConnectSQLServer()
        {
            string connstr = @"Provider = SQLOLEDB; Data Source =localhost\SQLEXPRESS; Initial Catalog =userdb; User Id=sa;Password=admin";
            OleDbConnection con = new OleDbConnection(connstr);

            con.Open();

            //how to check connection is connected or not?
            Console.WriteLine("SQL Server Connected");
            Console.WriteLine("Connection status is:" + con.State.ToString());
            Console.WriteLine("Connection status is:" + con.ServerVersion.ToString());

            //SQL Command Samples
            string query = "select * from Mytable";
            OleDbCommand selectcmd = new OleDbCommand(query, con);
            selectcmd.ExecuteNonQuery();
        }

然后我就好像突然开了窍,一天把
Json
XML
Excel
的读取全部搞定了

待续

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值