关于Excel数据批量导入数据库的案例
写这个案例主要是感觉这个功能挺实用,很多地方会用得到的,废话就不多说了,直接上对应的源码。
这个案例我运用的是Winform窗体程序实现数据的导入。
首先是数据库的登陆界面如下:
源码如下:
1 using System; 2 using System.Data.SqlClient; 3 using System.Windows.Forms; 4 5 namespace Winform_SqlBulkCopy 6 { 7 public partial class Frm_SetServer : Form 8 { 9 #region 全局变量 10 /// <summary> 11 /// 数据库连接字符串 12 /// </summary> 13 string sqlconnstr; 14 #endregion 15 16 #region 构造函数 17 /// <summary> 18 /// 构造函数 19 /// </summary> 20 public Frm_SetServer() 21 { 22 InitializeComponent(); 23 Load += new EventHandler(SetServer_Load); 24 } 25 #endregion 26 27 #region 窗体加载 28 /// <summary> 29 /// 窗体加载 30 /// </summary> 31 /// <param name="sender"></param> 32 /// <param name="e"></param> 33 void SetServer_Load(object sender, EventArgs e) 34 { 35 Init(); 36 Evenhand(); 37 } 38 #endregion 39 40 #region 初始化 41 /// <summary> 42 /// 初始化 43 /// </summary> 44 void Init() 45 { 46 AcceptButton = bt_Conn_Test; 47 MaximizeBox = false; 48 MaximumSize = MinimumSize = Size; 49 } 50 #endregion 51 52 #region 事件源绑定 53 /// <summary> 54 /// 事件源绑定 55 /// </summary> 56 void Evenhand() 57 { 58 //单选按钮 59 rd_SqlServer.Click += new EventHandler(rd_Click); 60 rd_Windows.Click += new EventHandler(rd_Click); 61 //按钮 62 bt_Conn_Test.Click += new EventHandler(bt_Click); 63 bt_Login.Click += new EventHandler(bt_Click); 64 } 65 #endregion 66 67 #region 控件事件 68 69 #region 选中单选按钮 70 /// <summary> 71 /// 选中单选按钮 72 /// </summary> 73 /// <param name="sender"></param> 74 /// <param name="e"></param> 75 void rd_Click(object sender, EventArgs e) 76 { 77 switch ((sender as RadioButton).Name) 78 { 79 case "rd_Windows": 80 lb_Uid.Enabled = false; 81 lb_Pwd.Enabled = false; 82 txt_Uid.Enabled = false; 83 txt_Pwd.Enabled = false; 84 break; 85 case "rd_SqlServer": 86 lb_Uid.Enabled = true; 87 lb_Pwd.Enabled = true; 88 txt_Uid.Enabled = true; 89 txt_Pwd.Enabled = true; 90 break; 91 default: 92 break; 93 } 94 } 95 #endregion 96 97 #region 单击按钮 98 /// <summary> 99 /// 单击按钮 100 /// </summary> 101 /// <param name="sender"></param> 102 /// <param name="e"></param> 103 void bt_Click(object sender, EventArgs e) 104 { 105 if (txt_Server.Text.Trim().Length == 0) 106 { MessageBox.Show("ServerName Is Null ."); return; } 107 if (rd_SqlServer.Checked) 108 { 109 if (txt_Uid.Text.Trim().Length == 0) 110 { MessageBox.Show("Uid Is Null ."); return; } 111 if (txt_Pwd.Text.Trim().Length == 0) 112 { MessageBox.Show("Pwd Is Null ."); return; } 113 } 114 switch ((sender as Button).Name) 115 { 116 case "bt_Conn_Test"://测试连接 117 bt_Login.Enabled = false; 118 if (rd_SqlServer.Checked)//sqlserver登陆 119 { 120 using (SqlConnection conn = new SqlConnection(string.Format(@"server={0};database=master;uid={1};pwd={2}", 121 txt_Server.Text.Trim(), txt_Uid.Text.Trim(), txt_Pwd.Text.Trim()))) 122 { 123 try 124 { sqlconnstr = conn.ConnectionString; conn.Open(); bt_Login.Enabled = true; AcceptButton = bt_Login; } 125 catch 126 { MessageBox.Show("服务器连接失败!"); } 127 } 128 } 129 else//windows身份验证过 130 { 131 using (SqlConnection conn = new SqlConnection(string.Format(@"Data Source={0};database = master;Integrated security = true", txt_Server.Text.Trim()))) 132 { 133 try 134 { sqlconnstr = conn.ConnectionString; conn.Open(); bt_Login.Enabled = true; AcceptButton = bt_Login; } 135 catch 136 { MessageBox.Show("服务器连接失败!"); } 137 } 138 } 139 break; 140 case "bt_Login"://登陆 141 Frm_ReadExcel show = new Frm_ReadExcel(sqlconnstr); 142 show.Show(); 143 Hide(); 144 break; 145 default: 146 break; 147 } 148 } 149 #endregion 150 151 #endregion 152 153 154 } 155 }
登录后进入导入界面如下:
实现的源代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Data.OleDb; 5 using System.Data.SqlClient; 6 using System.Windows.Forms; 7 8 namespace Winform_SqlBulkCopy 9 { 10 public partial class Frm_ReadExcel : Form 11 { 12 #region 全局变量 13 DataSet ds; 14 string[] tablenames; 15 SqlConnection conn; 16 string connstr; 17 List<SqlBulkCopyColumnMapping> SqlBulkCopyparameters; 18 #endregion 19 20 #region 构造函数 21 /// <summary> 22 /// 构造函数 23 /// </summary> 24 /// <param name="_connstr">sqlserver连接字符串</param> 25 public Frm_ReadExcel(string _connstr) 26 { 27 connstr = _connstr; 28 InitializeComponent(); 29 Load += new EventHandler(Frm_ReadExcel_Load); 30 } 31 #endregion 32 33 #region 窗体加载 34 void Frm_ReadExcel_Load(object sender, EventArgs e) 35 { 36 Init(); 37 EventHand(); 38 } 39 #endregion 40 41 #region 初始化 42 void Init() 43 { 44 conn = new SqlConnection(connstr);//SqlConnection实例化 45 MaximizeBox = false;//禁用最小化 46 MaximumSize = MinimumSize = Size;//固定当前大小 47 txt_filepath.ReadOnly = true; 48 com_databasename.DropDownStyle = com_tablename.DropDownStyle = ComboBoxStyle.DropDownList;//下拉框只可选 49 try 50 { 51 conn.Open(); 52 using (SqlCommand cmd = conn.CreateCommand()) 53 { 54 cmd.CommandText = @"select name from sysdatabases"; 55 SqlDataReader reader = cmd.ExecuteReader();//获取所有数据库 56 while (reader.Read()) com_databasename.Items.Add(reader[0].ToString()); 57 if (com_databasename.Items.Count > 0) com_databasename.SelectedIndex = 0; 58 } 59 } 60 catch (Exception ex) 61 { MessageBox.Show(ex.Message); } 62 finally 63 { conn.Close(); } 64 } 65 #endregion 66 67 #region 控件事件挂接 68 void EventHand() 69 { 70 com_databasename.SelectedIndexChanged += new EventHandler(com_databasename_SelectedIndexChanged); 71 bt_see.Click += new EventHandler(bt_see_Click); 72 bt_next.Click += new EventHandler(btn_next_Click); 73 bt_SetColumns.Click += new EventHandler(bt_SetColumns_Click); 74 bt_ok.Click += new EventHandler(bt_ok_Click); 75 bt_instruction.Click += new EventHandler(bt_instruction_Click); 76 dgv_show.DataError += new DataGridViewDataErrorEventHandler(dgv_show_DataError); 77 FormClosing += new FormClosingEventHandler(Frm_ReadExcel_FormClosing); 78 } 79 #endregion 80 81 #region 控件事件响应 82 #region 修改数据库 83 /// <summary> 84 /// 修改数据库 85 /// </summary> 86 /// <param name="sender"></param> 87 /// <param name="e"></param> 88 void com_databasename_SelectedIndexChanged(object sender, EventArgs e) 89 { 90 try 91 { 92 conn.Open(); 93 conn.ChangeDatabase(com_databasename.Text.Trim());//更换数据库(connection内置方法) 94 using (SqlCommand cmd = conn.CreateCommand()) 95 { 96 cmd.CommandText = @"select name from sysobjects where xtype='u'"; 97 SqlDataReader reader = cmd.ExecuteReader();//获取所选数据库中的所有表 98 com_tablename.Items.Clear(); 99 while (reader.Read()) com_tablename.Items.Add(reader[0].ToString()); 100 if (com_tablename.Items.Count > 0) com_tablename.SelectedIndex = 0; 101 } 102 } 103 catch (Exception ex) 104 { 105 MessageBox.Show(ex.Message); 106 } 107 finally 108 { 109 conn.Close(); 110 } 111 } 112 #endregion 113 114 #region 选择Excel文件 115 /// <summary> 116 /// 选择Excel文件 117 /// </summary> 118 /// <param name="sender"></param> 119 /// <param name="e"></param> 120 void bt_see_Click(object sender, EventArgs e) 121 { 122 try 123 { 124 OpenFileDialog open = new OpenFileDialog(); 125 open.Filter = "WPS表格(*.et)|*.et|Excel2007(*.xlsx)|*.xlsx|Excel2003(*.xls)|*.xls|所有文件(*.*)|*.*"; 126 open.ShowDialog();//选择文件 127 txt_filepath.Text = open.FileName; 128 ReadExcel(open.FileName, 0); 129 } 130 catch (Exception ex) 131 { 132 MessageBox.Show(ex.Message); 133 } 134 } 135 #endregion 136 137 #region 选择下一个单元表 138 /// <summary> 139 /// 选择下一个单元表 140 /// </summary> 141 /// <param name="sender"></param> 142 /// <param name="e"></param> 143 void btn_next_Click(object sender, EventArgs e) 144 { 145 int index = 0; 146 if (tablenames.Length <= 0) { MessageBox.Show("请选择有效的数据源"); return; } 147 for (int i = 0; i < tablenames.Length; i++) 148 if (tablenames[i].Substring(0, tablenames[i].Length - 1) == lb_tablename.Text.Substring(3, lb_tablename.Text.Length - 3)) index = i; 149 if (index == tablenames.Length - 1) index = 0; 150 else index++; 151 ReadExcel(txt_filepath.Text, index); 152 } 153 #endregion 154 155 #region 数据列设置 156 /// <summary> 157 /// 数据列设置 158 /// </summary> 159 /// <param name="sender"></param> 160 /// <param name="e"></param> 161 void bt_SetColumns_Click(object sender, EventArgs e) 162 { 163 List<string> ExcelColumns = new List<string>(); 164 List<string> SqlColumns = new List<string>(); 165 //获取数据原的列头 166 DataTable dt = (DataTable)dgv_show.DataSource; 167 if (dt == null) { MessageBox.Show("请选择数据源"); return; } 168 foreach (DataColumn column in dt.Columns) ExcelColumns.Add(column.ColumnName); 169 //获取数据表的列头 170 if (string.IsNullOrEmpty(com_databasename.Text.Trim()) || string.IsNullOrEmpty(com_tablename.Text.Trim())) 171 { MessageBox.Show("请选择数据库"); return; } 172 173 try 174 { 175 conn.Open(); 176 conn.ChangeDatabase(com_databasename.Text);//更换数据库 177 using (SqlCommand cmd = conn.CreateCommand()) 178 { 179 cmd.CommandText = @"select name from syscolumns where id in (select id from sysobjects where name=@name) "; 180 cmd.Parameters.Add(new SqlParameter("@name", com_tablename.Text.Trim())); 181 using (SqlDataReader reader = cmd.ExecuteReader()) 182 while (reader.Read()) SqlColumns.Add(reader[0].ToString()); 183 } 184 Frm_SetColumns frm_show = new Frm_SetColumns(ExcelColumns, SqlColumns); 185 frm_show.DeleteSet = GetColumns; 186 frm_show.ShowDialog(); 187 } 188 catch (Exception ex) 189 { 190 MessageBox.Show(ex.Message); 191 } 192 finally 193 { 194 conn.Close(); 195 } 196 } 197 #endregion 198 199 #region 委托、获取参数 200 /// <summary> 201 /// 委托、获取参数 202 /// </summary> 203 void GetColumns(List<SqlBulkCopyColumnMapping> _SqlBulkCopyparameters) 204 { 205 SqlBulkCopyparameters = _SqlBulkCopyparameters; 206 } 207 #endregion 208 209 #region SqlBulkCopy导入数据 210 /// <summary> 211 /// SqlBulkCopy导入数据 212 /// </summary> 213 /// <param name="sender"></param> 214 /// <param name="e"></param> 215 void bt_ok_Click(object sender, EventArgs e) 216 { 217 if (SqlBulkCopyparameters == null) 218 { MessageBox.Show("参数未设置!"); return; } 219 try 220 { 221 DateTime begin = DateTime.Now; 222 conn.Open(); 223 conn.ChangeDatabase(com_databasename.Text.Trim());//重新指定数据库 224 SqlBulkCopy bulkcopy = new SqlBulkCopy(conn); 225 foreach (SqlBulkCopyColumnMapping columnsmapping in SqlBulkCopyparameters) 226 bulkcopy.ColumnMappings.Add(columnsmapping);//加载文件与表的列名 227 bulkcopy.DestinationTableName = com_tablename.Text.Trim();//指定目标表的表名 228 DataTable table = (DataTable)dgv_show.DataSource;//获取要Copy的数据源 229 bulkcopy.WriteToServer(table);//将table Copy到数据库 230 DateTime end = DateTime.Now; 231 string mgr = string.Format("服务器:{0}\n数据库:{1}\n表名:{2}\n共复制{3}条数据\n耗时{4}毫秒", 232 conn.DataSource, com_databasename.Text, com_tablename.Text.Trim(), 233 table.Rows.Count, (end - begin).TotalMilliseconds); 234 MessageBox.Show(mgr);//弹出信息 235 } 236 catch (Exception ex) 237 { 238 MessageBox.Show(ex.Message); 239 } 240 finally 241 { conn.Close(); } 242 } 243 #endregion 244 245 #region 说明 246 /// <summary> 247 /// 说明 248 /// </summary> 249 /// <param name="sender"></param> 250 /// <param name="e"></param> 251 void bt_instruction_Click(object sender, EventArgs e) 252 { 253 string mgr = string.Format("1.Excel文件的第一行为列名,用于与数据表匹配\n2.导入之前请先设置列名的对应关系!\n"); 254 MessageBox.Show(mgr, "说明"); 255 } 256 #endregion 257 258 #region 结果集数据处理 259 /// <summary> 260 /// 结果集数据处理 261 /// </summary> 262 /// <param name="sender"></param> 263 /// <param name="e"></param> 264 void dgv_show_DataError(object sender, DataGridViewDataErrorEventArgs e) 265 { MessageBox.Show(e.Exception.Message, "结果集提示"); } 266 #endregion 267 268 #region 窗体关闭 269 /// <summary> 270 /// 窗体关闭 271 /// </summary> 272 /// <param name="sender"></param> 273 /// <param name="e"></param> 274 void Frm_ReadExcel_FormClosing(object sender, FormClosingEventArgs e) 275 { 276 Application.Exit(); 277 } 278 #endregion 279 280 #endregion 281 282 #region 自定义方法 283 /// <summary> 284 /// 读取Excel 285 /// </summary> 286 /// <param name="filename">文件名(含格式)</param> 287 /// <param name="index">页数(默认0:第一页)</param> 288 void ReadExcel(string filename, int index) 289 { 290 using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";" + "Extended Properties=Excel 8.0;")) 291 { 292 conn.Open(); 293 DataTable table = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 294 tablenames = new string[table.Rows.Count]; 295 for (int i = 0; i < table.Rows.Count; i++) tablenames[i] = table.Rows[i][2].ToString();//获取Excel的表名 296 if (tablenames.Length <= 0) 297 { MessageBox.Show("Excel中没有表!"); return; } 298 using (OleDbCommand cmd = conn.CreateCommand()) 299 { 300 lb_tablename.Text = "表名:" + tablenames[index].Substring(0, tablenames[index].Length - 1); 301 cmd.CommandText = "select * from [" + tablenames[index] + "]"; 302 ds = new DataSet(); 303 using (OleDbDataAdapter da = new OleDbDataAdapter(cmd)) 304 { 305 da.Fill(ds, tablenames[index]); 306 dgv_show.DataSource = ds.Tables[0]; 307 } 308 } 309 } 310 } 311 312 #endregion 313 314 315 } 316 }
配置列名的界面如下:
实现源代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Data.SqlClient; 10 11 namespace Winform_SqlBulkCopy 12 { 13 public partial class Frm_SetColumns : Form 14 { 15 #region 全局变量 16 /// <summary> 17 /// 委托 18 /// </summary> 19 public Action<List<SqlBulkCopyColumnMapping>> DeleteSet; 20 List<string> ExcelColumns, SqlColumns; 21 #endregion 22 23 #region 构造函数 24 /// <summary> 25 /// 构造函数 26 /// </summary> 27 /// <param name="_ExcelColumns">Excel列</param> 28 /// <param name="_SqlColumns">数据库列</param> 29 public Frm_SetColumns(List<string> _ExcelColumns, List<string> _SqlColumns) 30 { 31 ExcelColumns = _ExcelColumns; 32 SqlColumns = _SqlColumns; 33 InitializeComponent(); 34 Load += new EventHandler(SetColumns_Load); 35 } 36 #endregion 37 38 #region 窗体加载 39 /// <summary> 40 /// 窗体加载 41 /// </summary> 42 /// <param name="sender"></param> 43 /// <param name="e"></param> 44 void SetColumns_Load(object sender, EventArgs e) 45 { 46 Init(); 47 EventHand(); 48 } 49 #endregion 50 51 #region 初始化 52 /// <summary> 53 /// 初始化 54 /// </summary> 55 void Init() 56 { 57 MaximizeBox = false; 58 MaximumSize = MinimumSize = Size; 59 foreach (string item in ExcelColumns) listbox_Excel.Items.Add(item); 60 foreach (string item in SqlColumns) listbox_Ssms.Items.Add(item); 61 if (ExcelColumns.Count != SqlColumns.Count) Text += "(字段数量不匹配)"; 62 } 63 #endregion 64 65 #region 控件事件挂接 66 /// <summary> 67 /// 控件事件挂接 68 /// </summary> 69 void EventHand() 70 { 71 //Excel控制 72 lb_Excel_First.Click += new EventHandler(lb_Click); 73 lb_Excel_Before.Click += new EventHandler(lb_Click); 74 lb_Excel_Next.Click += new EventHandler(lb_Click); 75 lb_Excel_Last.Click += new EventHandler(lb_Click); 76 lb_Excel_Del.Click += new EventHandler(lb_Click); 77 //Sql控制 78 lb_Sql_First.Click += new EventHandler(lb_Click); 79 lb_Sql_Before.Click += new EventHandler(lb_Click); 80 lb_Sql_Next.Click += new EventHandler(lb_Click); 81 lb_Sql_Last.Click += new EventHandler(lb_Click); 82 //确定 83 bt_OK.Click += new EventHandler(bt_OK_Click); 84 } 85 #endregion 86 87 #region 控件事件响应 88 void lb_Click(object sender, EventArgs e) 89 { 90 object excelitem = listbox_Excel.SelectedItem; 91 object sqlitem = listbox_Ssms.SelectedItem; 92 int excelindex, sqlindex; 93 switch ((sender as Label).Name) 94 { 95 //Excel 96 case "lb_Excel_First": 97 if (excelitem == null) return; 98 excelindex = listbox_Excel.SelectedIndex; 99 if (excelindex <= 0) return; 100 listbox_Excel.Items.Remove(listbox_Excel.SelectedItem); 101 listbox_Excel.Items.Insert(0, excelitem); 102 listbox_Excel.SelectedIndex = 0; 103 break; 104 case "lb_Excel_Before": 105 if (excelitem == null) return; 106 excelindex = listbox_Excel.SelectedIndex; 107 if (excelindex <= 0) return; 108 listbox_Excel.Items.Remove(listbox_Excel.SelectedItem); 109 listbox_Excel.Items.Insert(excelindex - 1, excelitem); 110 listbox_Excel.SelectedIndex = excelindex - 1; 111 break; 112 case "lb_Excel_Next": 113 if (excelitem == null) return; 114 excelindex = listbox_Excel.SelectedIndex; 115 if (excelindex >= listbox_Excel.Items.Count - 1) return; 116 listbox_Excel.Items.Remove(listbox_Excel.SelectedItem); 117 listbox_Excel.Items.Insert(excelindex + 1, excelitem); 118 listbox_Excel.SelectedIndex = excelindex + 1; 119 break; 120 case "lb_Excel_Last": 121 if (excelitem == null) return; 122 excelindex = listbox_Excel.SelectedIndex; 123 if (excelindex >= listbox_Excel.Items.Count - 1) return; 124 listbox_Excel.Items.Remove(listbox_Excel.SelectedItem); 125 listbox_Excel.Items.Insert(listbox_Excel.Items.Count - 1, excelitem); 126 listbox_Excel.SelectedIndex = listbox_Excel.Items.Count - 1; 127 break; 128 case "lb_Excel_Del": 129 if (excelitem == null) return; 130 excelindex = listbox_Excel.SelectedIndex; 131 if (excelindex >= listbox_Excel.Items.Count) return; 132 listbox_Excel.Items.Remove(listbox_Excel.SelectedItem); 133 listbox_Excel.SelectedIndex = listbox_Excel.Items.Count - 1; 134 break; 135 //Sql 136 case "lb_Sql_First": 137 if (sqlitem == null) return; 138 sqlindex = listbox_Ssms.SelectedIndex; 139 if (sqlindex <= 0) return; 140 listbox_Ssms.Items.Remove(listbox_Ssms.SelectedItem); 141 listbox_Ssms.Items.Insert(0, sqlitem); 142 listbox_Ssms.SelectedIndex = 0; 143 break; 144 case "lb_Sql_Before": 145 if (sqlitem == null) return; 146 sqlindex = listbox_Ssms.SelectedIndex; 147 if (sqlindex <= 0) return; 148 listbox_Ssms.Items.Remove(listbox_Ssms.SelectedItem); 149 listbox_Ssms.Items.Insert(sqlindex - 1, sqlitem); 150 listbox_Ssms.SelectedIndex = sqlindex - 1; 151 break; 152 case "lb_Sql_Next": 153 if (sqlitem == null) return; 154 sqlindex = listbox_Ssms.SelectedIndex; 155 if (sqlindex >= listbox_Ssms.Items.Count - 1) return; 156 listbox_Ssms.Items.Remove(listbox_Ssms.SelectedItem); 157 listbox_Ssms.Items.Insert(sqlindex + 1, sqlitem); 158 listbox_Ssms.SelectedIndex = sqlindex + 1; 159 break; 160 case "lb_Sql_Last": 161 if (sqlitem == null) return; 162 sqlindex = listbox_Ssms.SelectedIndex; 163 if (sqlindex >= listbox_Ssms.Items.Count - 1) return; 164 listbox_Ssms.Items.Remove(listbox_Ssms.SelectedItem); 165 listbox_Ssms.Items.Insert(listbox_Ssms.Items.Count - 1, sqlitem); 166 listbox_Ssms.SelectedIndex = listbox_Ssms.Items.Count - 1; 167 break; 168 default: break; 169 } 170 } 171 172 private void bt_OK_Click_1(object sender, EventArgs e) 173 { 174 175 } 176 177 void bt_OK_Click(object sender, EventArgs e) 178 { 179 if (listbox_Excel.Items.Count != listbox_Ssms.Items.Count) 180 { MessageBox.Show("Excel表格与数据库的列不相同,不能保存!"); return; } 181 List<SqlBulkCopyColumnMapping> list = new List<SqlBulkCopyColumnMapping>(); 182 for (int i = 0; i < listbox_Excel.Items.Count; i++) 183 list.Add(new SqlBulkCopyColumnMapping(listbox_Excel.Items[i].ToString(), listbox_Ssms.Items[i].ToString())); 184 DeleteSet(list); 185 DialogResult = DialogResult.OK; 186 } 187 #endregion 188 } 189 }
以上便是该案例的核心代码,具体项目源代码可在百度云盘下载,地址:http://pan.baidu.com/s/1mhUXzi4,如遇到需要交流的地方,欢迎下方留言。
生命不息,奋斗不止!只要相信,只要坚持,只要你真的是用生命在热爱,那一定是天赋使命使然,那就是一个人该坚持和努力的东西,无论梦想是什么,无论路有多曲折多遥远,只要是灵魂深处的热爱,就会一直坚持到走上属于自己的舞台!