小子菜鸟一枚,刚毕业,第一次写博客,经历了一段工作经历后觉得还是觉得得把一些东西记录下来才好,最近在搞数据库方面的知识,以后会贴一些数据库方面的的帖子 ,用来加深记忆的!

一、说明

  Python版本:3.6.2  操作系统:Windows
 作者:SmallWZQ

1.数据库名为Demo,数据结构如图,image类型是用来保存byte[]数组的

  1) 这个类 是我 在真实项目中,优化解决真实问题
时,不参考第三方代码,完全由自己查阅MSDN官方文档 ,
完成的一个真实生产环境中使用的功能类

  在Python中,字符串也是一种数据类型。相比其它数据类型,字符串算是比较复杂的。为何呢?因为字符串不仅包含英文字母,还包括各国的语言文字。既然字符串包含各国语言,因此字符串还涉及编码问题。

图片 1

  2) 读者在使用此类时,请尊重原创,在代码中加上原创注释://  Author —
Meng.NET (cnblogs.com)  ,同时欢迎 二次改进、二次创作 以共同进步

  在Python 3.x版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言。

2.后台代码如下

  3)
此代码以【面向对象】、【C#闭包】、【异步回调】、【超时】、【等待】、【自动重试】方式实现及完成,且可以配置扩展

  示例代码如下:

 class Program
    {
        public static readonly string conStr = "Data Source = .;Initial Catalog = Demo;Integrated Security = SSPI;";
        static void Main(string[] args)
        {
            #region 图片转为二进制流写进数据库
            byte[] buffer = ImageToByte(@"G:\2.jpg");
            if (PushDataBase(buffer) > 0)
            {
                Console.WriteLine("OK");
                Console.Read();
            }
            #endregion

            #region 二进制流转图片
            //byte[] gBuffer = GetDataBase(3);
            //ByteToImage(gBuffer);
            //Console.WriteLine("OK");
            //Console.Read();
            #endregion

        }

        /// <summary>
        /// 图片转二进制流
        /// </summary>
        /// <param name="imgPath">图片路径</param>
        /// <returns></returns>
        public static byte[] ImageToByte(string imgPath)
        {
            Image image = Image.FromFile(imgPath);

            using (MemoryStream ms = new MemoryStream())
            {
                image.Save(ms, image.RawFormat);
                byte[] buffer = new byte[ms.Length];
                ms.Seek(0, SeekOrigin.Begin);
                ms.Read(buffer, 0, buffer.Length);
                return buffer;
            }
        }

        /// <summary>
        /// 字节流转图片
        /// </summary>
        /// <param name="buffer">图片二进制流</param>
        public static void ByteToImage(byte[] buffer)
        {
            MemoryStream ms = new MemoryStream();

            ms.Write(buffer, 0, buffer.Length);
            Image img = Image.FromStream(ms);
            string file = "mypicture2";
            if (img.RawFormat == ImageFormat.Jpeg)
            {
                file += ".jpg";

            }
            else if (img.RawFormat == ImageFormat.Png)
            {
                file += ".png";
            }
            else
            {
                file += ".jpg";
            }
            File.WriteAllBytes(file, buffer);
        }
        /// <summary>
        /// 写进数据库
        /// </summary>
        /// <param name="buffer">图片二进制流</param>
        /// <returns></returns>
        public static int PushDataBase(byte[] buffer)
        {
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                using (SqlCommand com = new SqlCommand())
                {
                    com.Connection = conn;
                    conn.Open();
                    com.CommandText = "insert into ImageData values(@image)";
                    com.Parameters.Add("@image", SqlDbType.Image).Value = buffer;
                    return com.ExecuteNonQuery();
                }
            }
        }
        /// <summary>
        /// 从数据库中读取
        /// </summary>
        /// <returns></returns>
        public static byte[] GetDataBase(int id)
        {
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                using (SqlCommand com = new SqlCommand())
                {
                    com.Connection = conn;
                    conn.Open();
                    com.CommandText = "select ImageByte from ImageData where Id=@id";
                    com.Parameters.Add("@id", SqlDbType.Int).Value = id;
                    using (SqlDataReader reader = com.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            return (byte[])reader[0];
                        }
                    }

                }
            }
            return null;
        }
    }

二、代码

1 #字符串包含中文
2 >>>print('我爱祖国!I love my country!')
3 我爱祖国!I love my country!

 好了,就到这了,不够150字居然不给发布了,我凑够字数先。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

  废话不多说,上干货,代码如下:

  字符串支持拼接语法。

图片 2图片 3

#拼接字符串
>>>x = "Hello,"
>>>y = 'world!'
>>>x + y
'Hello,world!'
>>>print(x + y)
Hello,world!
  1     /// <summary>
  2     /// 异步 Http
  3     /// </summary>
  4     public class Remoter
  5     {
  6         /*
  7          * LM,2016/08/18
  8          * C#闭包化,异步化,Web操作
  9          * 以便支持POS多接口多操作同时使用
 10          */
 11 
 12         /// <summary>
 13         /// 请求地址
 14         /// </summary>
 15         public string URL { get; set; }
 16 
 17         /// <summary>
 18         /// 请求方式
 19         /// </summary>
 20         public string RequestMethod { get; set; }
 21 
 22         /// <summary>
 23         /// 请求数据
 24         /// </summary>
 25         public string JsonContent { get; set; }
 26 
 27         //
 28         private byte[] Buffer { get; set; }        
 29         private Stream RequestStream { get; set; }        
 30         private HttpWebRequest Request { get; set; }        
 31         private bool ResponseFlag { get; set; }        
 32         private string Result { get; set; }        
 33         private bool TimeoutFlag  { get; set; }        
 34         private int TimeoutTime { get; set; }        
 35         private bool RetryFlag { get; set; }        
 36         private int RetryCount  { get; set; }        
 37         private int WaitSleep { get; set; }        
 38         private int TrySleep { get; set; }
 39 
 40         // 初始化
 41         public Remoter()
 42         {
 43             //
 44             ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
 45             ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) => true);
 46 
 47             // 
 48             this.URL = string.Empty;
 49             this.Request = default(HttpWebRequest);
 50             this.JsonContent = string.Empty;
 51             this.Buffer = default(byte[]);
 52             this.RequestStream = default(Stream);
 53             this.ResponseFlag = false;
 54             this.Result = string.Empty;
 55             this.TimeoutFlag = false;
 56             this.TimeoutTime = 10 * 1000;
 57             this.RetryFlag = false;
 58             this.RetryCount = 3;
 59             this.WaitSleep = 10;
 60             this.RequestMethod = "POST";
 61             this.TrySleep = 2000;
 62         }
 63         
 64         /// <summary>
 65         /// 获取响应数据
 66         /// </summary>
 67         public string GetRemoteData()
 68         {
 69             //
 70             if(string.IsNullOrWhiteSpace(this.URL))
 71             {
 72                 throw new Exception("HttpAsync.URL,未赋值!");
 73             }
 74 
 75             // 
 76             RemoteNew(SetResult); 
 77 
 78             //
 79             var timeNum = 0;
 80             while (true)
 81             {
 82                 if (ResponseFlag)
 83                 {
 84                     break;
 85                 }
 86                 if (TimeoutFlag)
 87                 {
 88                     throw new Exception(string.Format("请求超时!超时时间:{0}S", TimeoutTime / 1000));
 89                 }
 90                 timeNum += WaitSleep;
 91                 if (timeNum >= TimeoutTime)
 92                 {
 93                     TimeoutFlag = true;
 94                 }
 95                 Thread.Sleep(WaitSleep);
 96             }
 97 
 98             //
 99             return Result;
100         }
101 
102         // 
103         private void RemoteNew(Action<Remoter, string> action) 
104         {
105             //
106             var reNum = 0;
107             for (var i = 0; i < this.RetryCount; i++)
108             {
109                 try
110                 {
111                     //
112                     var uri = URL;
113 
114                     //
115                     this.Request = WebRequest.Create(uri) as HttpWebRequest;
116                     this.Request.KeepAlive = false;
117                     this.Request.Method = this.RequestMethod;
118                     this.Request.Credentials = CredentialCache.DefaultCredentials;
119                     if (this.RequestMethod.Equals("POST", StringComparison.OrdinalIgnoreCase))
120                     {
121                         this.Buffer = Encoding.UTF8.GetBytes(this.JsonContent);
122                         this.Request.ContentLength = this.Buffer.Length;
123                         this.Request.ContentType = "application/json";
124                         this.RequestStream = this.Request.GetRequestStream();
125                         this.RequestStream.Write(this.Buffer, 0, this.Buffer.Length);
126                         this.RequestStream.Close();
127                     }
128 
129                     //
130                     this.Request.BeginGetResponse((arr) =>
131                     {
132                         //
133                         var state = arr.AsyncState as Remoter;
134                         //
135                         var response = state.Request.EndGetResponse(arr) as HttpWebResponse;
136                         var respStream = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
137                         action(state, respStream.ReadToEnd());
138                         respStream.Close();
139                         response.Close();
140                     }, this);
141                     //
142                     break;
143                 }
144                 catch (Exception ex)
145                 {
146                     Thread.Sleep(this.TrySleep);
147                     reNum++;
148                     if (reNum == this.RetryCount)
149                     {
150                         throw new Exception(string.Format("重试失败!重试次数:{0}次,失败原因:{1}", this.RetryCount, ex.Message));
151                     }
152                     continue;
153                 }
154             }
155         }        
156         private void SetResult(Remoter state, string jsonData)
157         {
158             if (!string.IsNullOrWhiteSpace(jsonData))
159             {
160                 state.Result = jsonData;
161                 state.ResponseFlag = true;
162             }
163         }
164     }

  在Python中,值被转换为字符串的两种机制:

Remoter.cs

  一、str(),它会把值转换为合理形式的字符串,方便用户理解;

  使用方式:

  二、repr(),它会创建一个字符串,以合法的Python表达式的形式来表示值。

  GET: 

  对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:

图片 4图片 5

1 #ord()和chr()
2 >>> ord('A')
3 65
4 >>> ord('中')
5 20013
6 >>> chr(66)
7 'B'
8 >>> chr(25991)
9 '文'
1 var remoter = new Remoter();
2 remoter.RequestMethod = "GET";
3 remoter.URL = "这里是你要请求的URL";
4 var response = remoter.GetRemoteData();

  如果知道字符的整数编码,还可以用十六进制这么写str:

View Code

1 #十六进制——字符串编码
2 >>> '\u4e2d\u6587'
3 '中文'

  POST:

  两种写法完全是等价的。

图片 6图片 7

  由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。

1 var remoter = new Remoter();
2 remoter.RequestMethod = "POST";
3 remoter.URL = "你要请求的URL";
4 remoter.JsonContent = "你要想URL发送的JSON数据";
5 var response = remoter.GetRemoteData();

  如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。

View Code

  Python对bytes类型的数据用带b前缀的单引号或双引号表示:

三、代码解析

1 #Bytes编码
2 >>>s = b'ACV'
3 >>>print(s)
4 b'ACV'
5 >>>s
6 b'ACV'

    public Remoter()
初始化本类,可配置到 App.config/Web.config 中

  要注意区分'ABC'b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。 

图片 8图片 9

  以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

发表评论

电子邮件地址不会被公开。 必填项已用*标注